Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f881542834 | ||
|
|
e64d6edc73 | ||
|
|
b10378fe70 | ||
|
|
80b05973c6 | ||
|
|
426d9d5872 | ||
|
|
110a51c5b2 | ||
|
|
aa668856f7 | ||
|
|
d923dcf98b | ||
|
|
6e7759f1d5 | ||
|
|
2acd2a5615 | ||
|
|
f5a6df4ddb | ||
|
|
da553eec9b | ||
|
|
9a69d27009 | ||
|
|
83170a0e94 | ||
|
|
6d8c53bffd | ||
|
|
7944e75695 | ||
|
|
31653aef70 | ||
|
|
6a931588aa | ||
|
|
b4a754bdc0 | ||
|
|
199844e82c | ||
|
|
db06dd0275 | ||
|
|
72505b27cb | ||
|
|
9f26e7ed20 | ||
|
|
8e4e8b3e5a | ||
|
|
9eff2e9926 | ||
|
|
1c2ba72f02 | ||
|
|
5e54f20578 | ||
|
|
2d4429fa64 | ||
|
|
85baa22ca1 | ||
|
|
4690700a24 | ||
|
|
4745ad56e9 | ||
|
|
04357b7a55 | ||
|
|
a0f6e5272a | ||
|
|
eeeb350ed2 | ||
|
|
a68f0702e2 | ||
|
|
60a6c501fb | ||
|
|
5ff3f40116 | ||
|
|
662266a367 | ||
|
|
bc91a7c7b2 | ||
|
|
0ca65d7cfe | ||
|
|
47f26cc377 | ||
|
|
e0c53e7d1d | ||
|
|
d6da1cf25c | ||
|
|
fc4bef56a0 | ||
|
|
028473eb83 | ||
|
|
ac298b03c0 | ||
|
|
06ad6b8ba8 | ||
|
|
dbbbb2e5ed | ||
|
|
28b741a13a | ||
|
|
1ddc9cc889 | ||
|
|
53ab4d7e8d | ||
|
|
f8f7d5ac6f | ||
|
|
5887fb3815 | ||
|
|
234efc3be7 | ||
|
|
25f85fe123 | ||
|
|
3dadb8989b | ||
|
|
232fe286ee | ||
|
|
6192c48ef9 | ||
|
|
92aabb215f | ||
|
|
c76b30e353 | ||
|
|
1795141aec | ||
|
|
9f455a514e | ||
|
|
7090c02014 | ||
|
|
dc64ce331a | ||
|
|
094e5577e8 | ||
|
|
41e2a674e3 | ||
|
|
bdff046c57 |
No files matched your search
@@ -0,0 +1,174 @@
|
||||
########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2018, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
#########################################################################
|
||||
|
||||
#########################################################################
|
||||
# Create a Node container which will be used to build the JS components
|
||||
# and clean up the web/ source code
|
||||
#########################################################################
|
||||
|
||||
FROM node:8-alpine AS app-builder
|
||||
|
||||
RUN apk add --no-cache \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
g++ \
|
||||
libc6-compat \
|
||||
libjpeg-turbo-dev \
|
||||
libpng-dev \
|
||||
make \
|
||||
nasm \
|
||||
git \
|
||||
zlib-dev
|
||||
|
||||
# Create the /pgadmin4 directory and copy the source into it. Explicitly
|
||||
# remove the node_modules directory as we'll recreate a clean version, as well
|
||||
# as various other files we don't want
|
||||
COPY web /pgadmin4/web
|
||||
RUN rm -rf /pgadmin4/web/*.log \
|
||||
/pgadmin4/web/config_*.py \
|
||||
/pgadmin4/web/node_modules \
|
||||
/pgadmin4/web/regression \
|
||||
`find /pgadmin4/web -type d -name tests` \
|
||||
`find /pgadmin4/web -type f -name .DS_Store`
|
||||
|
||||
WORKDIR /pgadmin4/web
|
||||
|
||||
# Build the JS vendor code in the app-builder, and then remove the vendor source.
|
||||
RUN npm install && \
|
||||
npm audit fix && \
|
||||
rm -f yarn.lock && \
|
||||
yarn import && \
|
||||
yarn audit && \
|
||||
rm -f package-lock.json && \
|
||||
yarn run bundle && \
|
||||
rm -rf node_modules \
|
||||
yarn.lock \
|
||||
package.json \
|
||||
.[^.]* \
|
||||
babel.cfg \
|
||||
webpack.* \
|
||||
karma.conf.js \
|
||||
./pgadmin/static/js/generated/.cache
|
||||
|
||||
#########################################################################
|
||||
# Now, create a documentation build container for the Sphinx docs
|
||||
#########################################################################
|
||||
|
||||
FROM python:3.7-alpine3.10 as docs-builder
|
||||
|
||||
# Install only dependencies absolutely required for documentation building
|
||||
RUN apk add --no-cache \
|
||||
make \
|
||||
build-base \
|
||||
openssl-dev \
|
||||
libffi-dev && \
|
||||
pip install --no-cache-dir \
|
||||
sphinx \
|
||||
flask_security \
|
||||
flask_paranoid \
|
||||
python-dateutil \
|
||||
flask_sqlalchemy \
|
||||
flask_gravatar \
|
||||
flask_migrate \
|
||||
simplejson \
|
||||
cryptography
|
||||
|
||||
# Copy the docs from the local tree. Explicitly remove any existing builds that
|
||||
# may be present
|
||||
COPY docs /pgadmin4/docs
|
||||
COPY web /pgadmin4/web
|
||||
RUN rm -rf /pgadmin4/docs/en_US/_build
|
||||
|
||||
# Build the docs
|
||||
RUN LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 make -C /pgadmin4/docs/en_US -f Makefile.sphinx html
|
||||
|
||||
#########################################################################
|
||||
# Create additional builders to get all of the PostgreSQL utilities
|
||||
#########################################################################
|
||||
|
||||
FROM postgres:9.4-alpine as pg94-builder
|
||||
FROM postgres:9.5-alpine as pg95-builder
|
||||
FROM postgres:9.6-alpine as pg96-builder
|
||||
FROM postgres:10-alpine as pg10-builder
|
||||
FROM postgres:11-alpine as pg11-builder
|
||||
|
||||
FROM alpine:3.10 as tool-builder
|
||||
|
||||
# Copy the PG binaries
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-9.4/
|
||||
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-9.5/
|
||||
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-9.6/
|
||||
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-10/
|
||||
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-11/
|
||||
|
||||
#########################################################################
|
||||
# Assemble everything into the final container.
|
||||
#########################################################################
|
||||
|
||||
FROM python:3.7-alpine3.10
|
||||
|
||||
COPY --from=tool-builder /usr/local/pgsql /usr/local/
|
||||
|
||||
WORKDIR /pgadmin4
|
||||
ENV PYTHONPATH=/pgadmin4
|
||||
|
||||
# Copy in the code and docs
|
||||
COPY --from=app-builder /pgadmin4/web /pgadmin4
|
||||
COPY --from=docs-builder /pgadmin4/docs/en_US/_build/html/ /pgadmin4/docs
|
||||
COPY requirements.txt /pgadmin4/requirements.txt
|
||||
|
||||
# Install build-dependencies, build & install C extensions and purge deps in
|
||||
# one RUN step
|
||||
RUN apk add --no-cache --virtual \
|
||||
build-deps \
|
||||
build-base \
|
||||
postgresql-dev \
|
||||
libffi-dev \
|
||||
linux-headers && \
|
||||
apk add \
|
||||
postfix \
|
||||
postgresql-client \
|
||||
postgresql-libs && \
|
||||
pip install --upgrade pip && \
|
||||
pip install --no-cache-dir -r requirements.txt && \
|
||||
pip install --no-cache-dir gunicorn && \
|
||||
apk del --no-cache build-deps
|
||||
|
||||
# Copy the runner script
|
||||
COPY pkg/docker/run_pgadmin.py /pgadmin4
|
||||
COPY pkg/docker/entrypoint.sh /entrypoint.sh
|
||||
|
||||
# Precompile and optimize python code to save time and space on startup
|
||||
RUN python -O -m compileall -x node_modules /pgadmin4
|
||||
|
||||
# Finish up
|
||||
VOLUME /var/lib/pgadmin
|
||||
EXPOSE 80 443
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -77,7 +77,7 @@ runtime:
|
||||
cd runtime && qmake CONFIG+=release && make
|
||||
|
||||
# Include all clean sub-targets in clean
|
||||
clean: clean-appbundle clean-docker clean-dist clean-docs clean-node clean-pip clean-src clean-runtime
|
||||
clean: clean-appbundle clean-dist clean-docs clean-node clean-pip clean-src clean-runtime
|
||||
rm -rf web/pgadmin/static/js/generated/*
|
||||
rm -rf web/pgadmin/static/js/generated/.cache
|
||||
rm -rf web/pgadmin/static/css/generated/*
|
||||
@@ -90,9 +90,6 @@ clean-runtime:
|
||||
clean-appbundle:
|
||||
rm -rf mac-build/
|
||||
|
||||
clean-docker:
|
||||
rm -rf docker-build/
|
||||
|
||||
clean-dist:
|
||||
rm -rf dist/
|
||||
|
||||
@@ -109,7 +106,7 @@ clean-src:
|
||||
rm -rf src-build/
|
||||
|
||||
docker:
|
||||
./pkg/docker/build.sh
|
||||
docker build `python -c 'import web.config as c; print("-t {0} -t {0}:latest -t {0}:{1} -t {0}:{1}.{2}".format(c.APP_NAME.replace(" ", "").lower(), c.APP_RELEASE, c.APP_REVISION))'` .
|
||||
|
||||
docs:
|
||||
LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 $(MAKE) -C docs/en_US -f Makefile.sphinx html
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
.. _config_py:
|
||||
|
||||
***************************
|
||||
`The config.py File`:index:
|
||||
***************************
|
||||
|
||||
There are multiple configuration files that are read at startup by pgAdmin. These
|
||||
are as follows:
|
||||
|
||||
* ``config.py``: This is the main configuration file, and should not be modified.
|
||||
It can be used as a reference for configuration settings, that may be overridden
|
||||
in one of the following files.
|
||||
|
||||
* ``config_distro.py``: This file is read after ``config.py`` and is intended for
|
||||
packagers to change any settings that are required for their pgAdmin distribution.
|
||||
This may typically include certain paths and file locations. This file is optional,
|
||||
and may be created by packagers in the same directory as ``config.py`` if
|
||||
needed.
|
||||
|
||||
* ``config_local.py``: This file is read after ``config_distro.py`` and is intended
|
||||
for end users to change any default or packaging specific settings that they may
|
||||
wish to adjust to meet local preferences or standards.This file is optional,
|
||||
and may be created by users in the same directory as ``config.py`` if
|
||||
needed.
|
||||
|
||||
.. note:: If the SERVER_MODE setting is changed in ``config_distro.py`` or ``config_local.py``,
|
||||
you will most likely need to re-set the LOG_FILE, SQLITE_PATH, SESSION_DB_PATH
|
||||
and STORAGE_DIR values as well as they will have been set based on the default
|
||||
configuration or overridden by the runtime.
|
||||
|
||||
The default ``config.py`` file is shown below for reference:
|
||||
|
||||
.. literalinclude:: ../../web/config.py
|
||||
:language: python
|
||||
@@ -31,19 +31,19 @@ Environment Variables
|
||||
|
||||
The container will accept the following variables at startup:
|
||||
|
||||
*PGADMIN_DEFAULT_EMAIL*
|
||||
**PGADMIN_DEFAULT_EMAIL**
|
||||
|
||||
This is the email address used when setting up the initial administrator account
|
||||
to login to pgAdmin. This variable is required and must be set at launch time.
|
||||
|
||||
*PGADMIN_DEFAULT_PASSWORD*
|
||||
**PGADMIN_DEFAULT_PASSWORD**
|
||||
|
||||
This is the password used when setting up the initial administrator account to
|
||||
login to pgAdmin. This variable is required and must be set at launch time.
|
||||
|
||||
*PGADMIN_ENABLE_TLS*
|
||||
**PGADMIN_ENABLE_TLS**
|
||||
|
||||
Default: <null>
|
||||
*Default: <null>*
|
||||
|
||||
If left un-set, the container will listen on port 80 for connections in plain
|
||||
text. If set to any value, the container will listen on port 443 for TLS
|
||||
@@ -53,36 +53,51 @@ When TLS is enabled, a certificate and key must be provided. Typically these
|
||||
should be stored on the host file system and mounted from the container. The
|
||||
expected paths are /certs/server.crt and /certs/server.key
|
||||
|
||||
*PGADMIN_LISTEN_ADDRESS*
|
||||
**PGADMIN_LISTEN_ADDRESS**
|
||||
|
||||
Default: [::]
|
||||
*Default: [::]*
|
||||
|
||||
Specify the local address that the servers listens on. The default should work
|
||||
for most users - in IPv4-only environments, this may need to be set to
|
||||
127.0.0.1.
|
||||
|
||||
*PGADMIN_LISTEN_PORT*
|
||||
**PGADMIN_LISTEN_PORT**
|
||||
|
||||
Default: 80 or 443 (if TLS is enabled)
|
||||
*Default: 80 or 443 (if TLS is enabled)*
|
||||
|
||||
Allows the port that the server listens on to be set to a specific value rather
|
||||
than using the default.
|
||||
|
||||
*PGADMIN_SERVER_JSON_FILE*
|
||||
**PGADMIN_SERVER_JSON_FILE**
|
||||
|
||||
Default: /pgadmin4/servers.json
|
||||
*Default: /pgadmin4/servers.json*
|
||||
|
||||
Override the default file path for the server definition list. See the
|
||||
/pgadmin4/servers.json mapped file below for more information.
|
||||
|
||||
*GUNICORN_THREADS*
|
||||
**GUNICORN_THREADS**
|
||||
|
||||
Default: 25
|
||||
*Default: 25*
|
||||
|
||||
Adjust the number of threads the Gunicorn server uses to handle incoming
|
||||
requests. This should typically be left as-is, except in highly loaded systems
|
||||
where it may be increased.
|
||||
|
||||
**PGADMIN_CONFIG_**
|
||||
|
||||
This is a variable prefix that can be used to override any of the configuration
|
||||
options in pgAdmin's *config.py* file. Add the *PGADMIN_CONFIG_* prefix to any
|
||||
variable name from *config.py* and give the value in the format 'string value'
|
||||
for strings, True/False for booleans or 123 for numbers. See below for an
|
||||
example.
|
||||
|
||||
Settings are written to */pgadmin4/config_distro.py* within the container, which
|
||||
is read after */pgadmin4/config.py* and before */pgadmin4/config_local.py*.
|
||||
Any settings given will therefore override anything in config.py, but can be
|
||||
overridden by settings in config_local.py.
|
||||
|
||||
See :ref:`config_py` for more information on the available configuration settings.
|
||||
|
||||
Mapped Files and Directories
|
||||
****************************
|
||||
|
||||
@@ -90,20 +105,21 @@ The following files or directories can be mapped from the container onto the
|
||||
host machine to allow configuration to be customised and shared between
|
||||
instances:
|
||||
|
||||
*/var/lib/pgadmin*
|
||||
**/var/lib/pgadmin**
|
||||
|
||||
This is the working directory in which pgAdmin stores session data, user files,
|
||||
configuration files, and it's configuration database. Mapping this directory
|
||||
onto the host machine gives you an easy way to maintain configuration between
|
||||
invocations of the container.
|
||||
|
||||
*/pgadmin4/config_local.py*
|
||||
**/pgadmin4/config_local.py**
|
||||
|
||||
This file can be used to override configuration settings in pgAdmin. Settings
|
||||
found in config.py can be overridden with deployment specific values if
|
||||
required.
|
||||
required. Settings in config_local.py will also override anything specified in
|
||||
the container environment through *PGADMIN_CONFIG_* prefixed variables.
|
||||
|
||||
*/pgadmin4/servers.json*
|
||||
**/pgadmin4/servers.json**
|
||||
|
||||
If this file is mapped, server definitions found in it will be loaded at launch
|
||||
time. This allows connection information to be pre-loaded into the instance of
|
||||
@@ -111,11 +127,11 @@ pgAdmin in the container. Note that server definitions are only loaded on first
|
||||
launch, i.e. when the configuration database is created, and not on subsequent
|
||||
launches using the same configuration database.
|
||||
|
||||
*/certs/server.cert*
|
||||
**/certs/server.cert**
|
||||
|
||||
If TLS is enabled, this file will be used as the servers TLS certificate.
|
||||
|
||||
*/certs/server.key*
|
||||
**/certs/server.key**
|
||||
|
||||
If TLS is enabled, this file will be used as the key file for the servers TLS
|
||||
certificate.
|
||||
@@ -129,8 +145,21 @@ Run a simple container over port 80:
|
||||
|
||||
docker pull dpage/pgadmin4
|
||||
docker run -p 80:80 \
|
||||
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
|
||||
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
|
||||
-e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \
|
||||
-e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' \
|
||||
-d dpage/pgadmin4
|
||||
|
||||
Run a simple container over port 80, setting some configuration options:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
docker pull dpage/pgadmin4
|
||||
docker run -p 80:80 \
|
||||
-e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \
|
||||
-e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' \
|
||||
-e 'PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True' \
|
||||
-e 'PGADMIN_CONFIG_LOGIN_BANNER="Authorised users only!"' \
|
||||
-e 'PGADMIN_CONFIG_CONSOLE_LOG_LEVEL=10' \
|
||||
-d dpage/pgadmin4
|
||||
|
||||
Run a TLS secured container using a shared config/storage directory in
|
||||
@@ -141,13 +170,13 @@ Run a TLS secured container using a shared config/storage directory in
|
||||
|
||||
docker pull dpage/pgadmin4
|
||||
docker run -p 443:443 \
|
||||
-v "/private/var/lib/pgadmin:/var/lib/pgadmin" \
|
||||
-v "/path/to/certificate.cert:/certs/server.cert" \
|
||||
-v "/path/to/certificate.key:/certs/server.key" \
|
||||
-v "/tmp/servers.json:/servers.json" \
|
||||
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
|
||||
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
|
||||
-e "PGADMIN_ENABLE_TLS=True" \
|
||||
-v /private/var/lib/pgadmin:/var/lib/pgadmin \
|
||||
-v /path/to/certificate.cert:/certs/server.cert \
|
||||
-v /path/to/certificate.key:/certs/server.key \
|
||||
-v /tmp/servers.json:/servers.json \
|
||||
-e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \
|
||||
-e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' \
|
||||
-e 'PGADMIN_ENABLE_TLS=True' \
|
||||
-d dpage/pgadmin4
|
||||
|
||||
Reverse Proxying
|
||||
|
||||
@@ -12,7 +12,8 @@ will provide detailed information about creating a custom deployment.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
|
||||
config_py
|
||||
desktop_deployment
|
||||
server_deployment
|
||||
container_deployment
|
||||
container_deployment
|
||||
@@ -36,32 +36,10 @@ this is overridden by the desktop runtime at startup. In most environments, no
|
||||
Python configuration is required unless you wish to override other default
|
||||
settings.
|
||||
|
||||
There are multiple configuration files that are read at startup by pgAdmin. These
|
||||
are as follows:
|
||||
|
||||
* ``config.py``: This is the main configuration file, and should not be modified.
|
||||
It can be used as a reference for configuration settings, that may be overridden
|
||||
in one of the following files.
|
||||
|
||||
* ``config_distro.py``: This file is read after ``config.py`` and is intended for
|
||||
packagers to change any settings that are required for their pgAdmin distribution.
|
||||
This may typically include certain paths and file locations. This file is optional,
|
||||
and may be created by packagers in the same directory as ``config.py`` if
|
||||
needed.
|
||||
|
||||
* ``config_local.py``: This file is read after ``config_distro.py`` and is intended
|
||||
for end users to change any default or packaging specific settings that they may
|
||||
wish to adjust to meet local preferences or standards.This file is optional,
|
||||
and may be created by users in the same directory as ``config.py`` if
|
||||
needed.
|
||||
|
||||
.. note:: If the SERVER_MODE setting is changed in ``config_distro.py`` or ``config_local.py``,
|
||||
you will most likely need to re-set the LOG_FILE, SQLITE_PATH, SESSION_DB_PATH
|
||||
and STORAGE_DIR values as well as they will have been set based on the default
|
||||
configuration or overridden by the runtime.
|
||||
See :ref:`config_py` for more information on configuration settings.
|
||||
|
||||
Runtime
|
||||
-------
|
||||
*******
|
||||
|
||||
When executed, the runtime will automatically try to execute the pgAdmin Python
|
||||
application. If execution fails, it will prompt you to adjust the Python Path
|
||||
|
||||
@@ -35,6 +35,8 @@ disabled in either mode. Please see
|
||||
:ref:`The Query Tool Toolbar <query_tool_toolbar>` for a description of the
|
||||
available controls.
|
||||
|
||||
.. _data-grid:
|
||||
|
||||
The Data Grid
|
||||
*************
|
||||
|
||||
@@ -42,8 +44,6 @@ The top row of the data grid displays the name of each column, the data type,
|
||||
and if applicable, the number of characters allowed. A column that is part of
|
||||
the primary key will additionally be marked with [PK].
|
||||
|
||||
.. _modifying-data-grid:
|
||||
|
||||
To modify the displayed data:
|
||||
|
||||
* To change a numeric value within the grid, double-click the value to select
|
||||
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 31 KiB |
@@ -268,6 +268,37 @@ Tool display.
|
||||
a positive value above zero is specified, the notifier will be displayed for
|
||||
the specified number of seconds. The default is *5*.
|
||||
|
||||
.. image:: images/preferences_sql_editor.png
|
||||
:alt: Preferences dialog sqleditor editor settings
|
||||
:align: center
|
||||
|
||||
Use the fields on the *Editor* panel to change settings of the query editor.
|
||||
|
||||
* When the *Brace matching?* switch is set to *True*, the editor will highlight
|
||||
pairs of matched braces.
|
||||
|
||||
* When the *Code folding?* switch is set to *False*, the editor will disable
|
||||
code folding. Disabling will improve editor performance with large files.
|
||||
|
||||
* Use the *Font size* field to specify the font size that will be used in text
|
||||
boxes and editors.
|
||||
|
||||
* When the *Insert bracket pairs?* switch is set to *True*, the editor will
|
||||
automatically insert paired brackets.
|
||||
|
||||
* When the *Line wrapping* switch is set to *True*, the editor will implement
|
||||
line-wrapping behavior.
|
||||
|
||||
* When the *Plain text mode?* switch is set to *True*, the editor mode will be
|
||||
changed to text/plain. Keyword highlighting and code folding will be disabled.
|
||||
This will improve editor performance with large files.
|
||||
|
||||
* Use the *Tab size* field to specify the number of spaces per tab character in
|
||||
the editor.
|
||||
|
||||
* When the *Use spaces* switch is set to *True*, the editor will insert spaces
|
||||
(instead of tab characters) when the tab key or auto-indent are used.
|
||||
|
||||
.. image:: images/preferences_sql_explain.png
|
||||
:alt: Preferences dialog sqleditor explain options
|
||||
:align: center
|
||||
@@ -300,18 +331,6 @@ Use the fields on the *Options* panel to manage editor preferences.
|
||||
* When the *Auto-Rollback?* switch is set to *True*, failed queries are rolled
|
||||
back.
|
||||
|
||||
* When the *Brace matching?* switch is set to *True*, the editor will highlight
|
||||
pairs of matched braces.
|
||||
|
||||
* Use the *Font size* field to specify the font size that will be used in text
|
||||
boxes and editors.
|
||||
|
||||
* When the *Insert bracket pairs?* switch is set to *True*, the editor will
|
||||
automatically insert paired brackets.
|
||||
|
||||
* When the *Line wrapping* switch is set to *True*, the editor will implement
|
||||
line-wrapping behavior.
|
||||
|
||||
* When the *Prompt to save unsaved data changes?* switch is set to *True*, the
|
||||
editor will prompt the user to saved unsaved data when exiting the data
|
||||
editor.
|
||||
@@ -324,12 +343,6 @@ Use the fields on the *Options* panel to manage editor preferences.
|
||||
*True*, the editor will prompt the user to commit or rollback changes when
|
||||
exiting the Query Tool while the current transaction is not committed.
|
||||
|
||||
* Use the *Tab size* field to specify the number of spaces per tab character in
|
||||
the editor.
|
||||
|
||||
* When the *Use spaces* switch is set to *True*, the editor will insert spaces
|
||||
(instead of tab characters) when the tab key or auto-indent are used.
|
||||
|
||||
.. image:: images/preferences_sql_results_grid.png
|
||||
:alt: Preferences dialog sql results grid section
|
||||
:align: center
|
||||
|
||||
@@ -130,15 +130,27 @@ You can:
|
||||
|
||||
A result set is updatable if:
|
||||
|
||||
* All the columns belong to the same table.
|
||||
* All the primary keys or OIDs of the table are explicitly selected.
|
||||
* No columns are duplicated.
|
||||
* All columns are either selected directly from a single table, or
|
||||
are not table columns at all (e.g. concatenation of 2 columns).
|
||||
Only columns that are selected directly from the table are
|
||||
editable, other columns are read-only.
|
||||
* All the primary key columns or OIDs of the table are selected in the
|
||||
result set.
|
||||
|
||||
Any columns that are renamed or selected more than once are also read-only.
|
||||
|
||||
Editable and read-only columns are identified using pencil and lock icons
|
||||
(respectively) in the column headers.
|
||||
|
||||
.. image:: images/query_tool_editable_columns.png
|
||||
:alt: Query tool editable and read-only columns
|
||||
:align: center
|
||||
|
||||
The psycopg2 driver version should be equal to or above 2.8 for updatable
|
||||
query result sets to work.
|
||||
|
||||
An updatable result set can be modified just like in
|
||||
:ref:`View/Edit Data <modifying-data-grid>` mode.
|
||||
An updatable result set is identical to the :ref:`Data Grid <data-grid>` in
|
||||
View/Edit Data mode, and can be modified in the same way.
|
||||
|
||||
If Auto-commit is off, the data changes are made as part of the ongoing
|
||||
transaction, if no transaction is ongoing a new one is initiated. The data
|
||||
|
||||
@@ -11,6 +11,7 @@ notes for it.
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
release_notes_4_13
|
||||
release_notes_4_12
|
||||
release_notes_4_11
|
||||
release_notes_4_10
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
************
|
||||
Version 4.13
|
||||
************
|
||||
|
||||
Release date: 2019-09-19
|
||||
|
||||
This release contains a number of bug fixes and new features since the release of pgAdmin4 4.12.
|
||||
|
||||
New features
|
||||
************
|
||||
|
||||
| `Issue #2828 <https://redmine.postgresql.org/issues/2828>`_ - Added Gather Merge, Named Tuple Store Scan and Table Function Scan icon for explain module.
|
||||
| `Issue #4553 <https://redmine.postgresql.org/issues/4553>`_ - Don't wait for the database connection before rendering the Query Tool UI, for improved UX.
|
||||
| `Issue #4651 <https://redmine.postgresql.org/issues/4651>`_ - Allow configuration options to be set from the environment in the container distribution.
|
||||
| `Issue #4667 <https://redmine.postgresql.org/issues/4667>`_ - Ensure editable and read-only columns in Query Tool should be identified by icons and tooltips in the column header.
|
||||
| `Issue #4691 <https://redmine.postgresql.org/issues/4691>`_ - Add an Italian translation.
|
||||
| `Issue #4752 <https://redmine.postgresql.org/issues/4752>`_ - Refactor Dockerfile to avoid needing to run supporting scripts (i.e. 'docker build .' will work) and minimise layers.
|
||||
|
||||
Housekeeping
|
||||
************
|
||||
|
||||
| `Issue #4575 <https://redmine.postgresql.org/issues/4575>`_ - Add Reverse Engineered SQL tests for Schemas.
|
||||
| `Issue #4576 <https://redmine.postgresql.org/issues/4576>`_ - Add Reverse Engineered SQL tests for Views.
|
||||
| `Issue #4600 <https://redmine.postgresql.org/issues/4600>`_ - Add Reverse Engineered SQL tests for Rules.
|
||||
| `Issue #4616 <https://redmine.postgresql.org/issues/4616>`_ - Add Reverse Engineered and Modified SQL tests for Foreign Keys.
|
||||
| `Issue #4617 <https://redmine.postgresql.org/issues/4617>`_ - Add Reverse Engineered and Modified SQL tests for Foreign Servers.
|
||||
| `Issue #4618 <https://redmine.postgresql.org/issues/4618>`_ - Add Reverse Engineered and Modified SQL tests for Foreign Tables.
|
||||
| `Issue #4619 <https://redmine.postgresql.org/issues/4619>`_ - Add Reverse Engineered and Modified SQL tests for FTS Templates.
|
||||
| `Issue #4621 <https://redmine.postgresql.org/issues/4621>`_ - Add Reverse Engineered and Modified SQL tests for Indexes.
|
||||
| `Issue #4624 <https://redmine.postgresql.org/issues/4624>`_ - Add Reverse Engineered and Modified SQL tests for Primary Keys.
|
||||
| `Issue #4627 <https://redmine.postgresql.org/issues/4627>`_ - Add Reverse Engineered and Modified SQL tests for User Mappings.
|
||||
| `Issue #4690 <https://redmine.postgresql.org/issues/4690>`_ - Add Modified SQL tests for Resource Group.
|
||||
|
||||
Bug fixes
|
||||
*********
|
||||
|
||||
| `Issue #2706 <https://redmine.postgresql.org/issues/2706>`_ - Added ProjectSet icon for explain module.
|
||||
| `Issue #3778 <https://redmine.postgresql.org/issues/3778>`_ - Ensure Boolean columns should be editable using keyboard keys.
|
||||
| `Issue #3936 <https://redmine.postgresql.org/issues/3936>`_ - Further code refactoring to stabilise the Feature Tests.
|
||||
| `Issue #4381 <https://redmine.postgresql.org/issues/4381>`_ - Fix an issue where oid column should not be pasted when copy/paste row is used on query output containing the oid column.
|
||||
| `Issue #4408 <https://redmine.postgresql.org/issues/4408>`_ - Fix display of validation error message in SlickGrid cells.
|
||||
| `Issue #4412 <https://redmine.postgresql.org/issues/4412>`_ - Fix issue where Validated switch option is inverted for the Foreign Key.
|
||||
| `Issue #4419 <https://redmine.postgresql.org/issues/4419>`_ - Fix a debugger error when using Python 2.7.
|
||||
| `Issue #4461 <https://redmine.postgresql.org/issues/4461>`_ - Fix error while importing data to a table using Import/Export dialog and providing "Not null columns" option.
|
||||
| `Issue #4486 <https://redmine.postgresql.org/issues/4486>`_ - Ensure View should be created with special characters.
|
||||
| `Issue #4487 <https://redmine.postgresql.org/issues/4487>`_ - Ensure Boolean columns should be editable in View/Edit data and Query Tool.
|
||||
| `Issue #4577 <https://redmine.postgresql.org/issues/4577>`_ - Fix an error that could be seen when click on any system column of a table.
|
||||
| `Issue #4584 <https://redmine.postgresql.org/issues/4584>`_ - Unescape HTML entities in database names in the Query Tool title bar.
|
||||
| `Issue #4631 <https://redmine.postgresql.org/issues/4631>`_ - Add editor options for plain text mode and to disable block folding to workaround rendering speed issues in CodeMirror with very large scripts.
|
||||
| `Issue #4642 <https://redmine.postgresql.org/issues/4642>`_ - Ensure port and username should not be mandatory when a service is provided.
|
||||
| `Issue #4643 <https://redmine.postgresql.org/issues/4643>`_ - Fix Truncate option deselect issue for compound triggers.
|
||||
| `Issue #4644 <https://redmine.postgresql.org/issues/4644>`_ - Fix length and precision enable/disable issue when changing the data type for Domain node.
|
||||
| `Issue #4650 <https://redmine.postgresql.org/issues/4650>`_ - Fix SQL tab issue for Views. It's a regression of compound triggers.
|
||||
| `Issue #4657 <https://redmine.postgresql.org/issues/4657>`_ - Fix PGADMIN_SERVER_JSON_FILE environment variable support in the container.
|
||||
| `Issue #4663 <https://redmine.postgresql.org/issues/4663>`_ - Fix exception in query history for python 2.7.
|
||||
| `Issue #4674 <https://redmine.postgresql.org/issues/4674>`_ - Fix query tool launch error if user name contain html characters.
|
||||
| `Issue #4681 <https://redmine.postgresql.org/issues/4681>`_ - Increase cache control max age for static files to improve performance over longer run.
|
||||
| `Issue #4698 <https://redmine.postgresql.org/issues/4698>`_ - Fix SQL issue of length and precision when changing the data type of Column.
|
||||
| `Issue #4702 <https://redmine.postgresql.org/issues/4702>`_ - Fix modified SQL for Index when reset the value of Fill factor and Clustered?.
|
||||
| `Issue #4703 <https://redmine.postgresql.org/issues/4703>`_ - Fix reversed engineered SQL for btree Index when provided sort order and NULLs.
|
||||
| `Issue #4726 <https://redmine.postgresql.org/issues/4726>`_ - Ensure sequence with negative value should be created.
|
||||
| `Issue #4727 <https://redmine.postgresql.org/issues/4727>`_ - Fix issue where EXEC script doesn't write the complete script for Procedures.
|
||||
| `Issue #4736 <https://redmine.postgresql.org/issues/4736>`_ - Fix query tool and view data issue with the Italian language.
|
||||
| `Issue #4742 <https://redmine.postgresql.org/issues/4742>`_ - Ensure Primary Key should be created with Index.
|
||||
| `Issue #4750 <https://redmine.postgresql.org/issues/4750>`_ - Fix query history exception for Python 3.6.
|
||||
@@ -59,24 +59,7 @@ In order to configure pgAdmin to run in server mode, it may be necessary to
|
||||
configure the Python code to run in multi-user mode, and then to configure the
|
||||
web server to find and execute the code.
|
||||
|
||||
Note that there are multiple configuration files that are read at startup by
|
||||
pgAdmin. These are as follows:
|
||||
|
||||
* ``config.py``: This is the main configuration file, and should not be modified.
|
||||
It can be used as a reference for configuration settings, that may be overridden
|
||||
in one of the following files.
|
||||
|
||||
* ``config_distro.py``: This file is read after ``config.py`` and is intended for
|
||||
packagers to change any settings that are required for their pgAdmin distribution.
|
||||
This may typically include certain paths and file locations. This file is optional,
|
||||
and may be created by packagers in the same directory as ``config.py`` if
|
||||
needed.
|
||||
|
||||
* ``config_local.py``: This file is read after ``config_distro.py`` and is intended
|
||||
for end users to change any default or packaging specific settings that they may
|
||||
wish to adjust to meet local preferences or standards. This file is optional,
|
||||
and may be created by administrators in the same directory as ``config.py`` if
|
||||
needed.
|
||||
See :ref:`config_py` for more information on configuration settings.
|
||||
|
||||
Python
|
||||
------
|
||||
@@ -117,6 +100,12 @@ In order to configure the Python code, follow these steps:
|
||||
|
||||
# chown www-data:www-data /var/lib/pgadmin4/pgadmin4.db
|
||||
|
||||
Hosting
|
||||
*******
|
||||
|
||||
There are many possible ways to host pgAdmin in server mode. Some examples are
|
||||
given below:
|
||||
|
||||
Apache HTTPD Configuration (Windows)
|
||||
------------------------------------
|
||||
|
||||
|
||||
@@ -47,15 +47,15 @@ a:hover {
|
||||
}
|
||||
|
||||
div.body dd, div.body blockquote {
|
||||
line-height: 1.8em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
div.body p{
|
||||
line-height: 1.8em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
div.body ul li{
|
||||
line-height: 1.8em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
div.body p strong{
|
||||
@@ -66,10 +66,6 @@ div.body li em, div.body p em{
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
div.toctree-wrapper ul li.toctree-l1{
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.toctree-wrapper ul li.toctree-l1 a cite{
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
@@ -262,7 +258,7 @@ div.sphinxsidebar form div:first-child{
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
line-height: 1.4rem;
|
||||
line-height: 1.2rem;
|
||||
font-size: 0.85rem;
|
||||
color: #858da0;
|
||||
background-color: #ebeef3;
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
pgadmin4/web/**/tests/
|
||||
pgadmin4/web/regression/
|
||||
@@ -1,99 +0,0 @@
|
||||
########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2018, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
#########################################################################
|
||||
|
||||
# First of all, build frontend with NodeJS in a separate builder container
|
||||
# Node-8 is supported by all needed C++ packages
|
||||
FROM node:8 AS node-builder
|
||||
|
||||
COPY ./pgadmin4/web/ /pgadmin4/web/
|
||||
WORKDIR /pgadmin4/web
|
||||
|
||||
RUN yarn install --cache-folder ./ycache --verbose && \
|
||||
yarn run bundle && \
|
||||
rm -rf ./ycache ./pgadmin/static/js/generated/.cache
|
||||
|
||||
# Build Sphinx documentation in separate container
|
||||
FROM python:3.7-alpine3.9 as docs-builder
|
||||
|
||||
# Install only dependencies absolutely required for documentation building
|
||||
RUN apk add --no-cache make build-base openssl-dev libffi-dev && \
|
||||
pip install --no-cache-dir sphinx flask_security flask_paranoid python-dateutil flask_sqlalchemy flask_gravatar flask_migrate simplejson cryptography
|
||||
|
||||
COPY ./pgadmin4/ /pgadmin4
|
||||
|
||||
# Build the docs
|
||||
RUN LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 make -C /pgadmin4/docs/en_US -f Makefile.sphinx html
|
||||
|
||||
# Get the PG binaries
|
||||
FROM postgres:9.4-alpine as pg94-builder
|
||||
FROM postgres:9.5-alpine as pg95-builder
|
||||
FROM postgres:9.6-alpine as pg96-builder
|
||||
FROM postgres:10-alpine as pg10-builder
|
||||
FROM postgres:11-alpine as pg11-builder
|
||||
|
||||
# Then install backend, copy static files and set up entrypoint
|
||||
FROM python:3.7-alpine3.9
|
||||
|
||||
# Copy the PG binaries
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_dump /usr/local/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_dumpall /usr/local/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/pg_restore /usr/local/pgsql-9.4/
|
||||
COPY --from=pg94-builder /usr/local/bin/psql /usr/local/pgsql-9.4/
|
||||
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_dump /usr/local/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_dumpall /usr/local/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/pg_restore /usr/local/pgsql-9.5/
|
||||
COPY --from=pg95-builder /usr/local/bin/psql /usr/local/pgsql-9.5/
|
||||
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_dump /usr/local/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_dumpall /usr/local/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/pg_restore /usr/local/pgsql-9.6/
|
||||
COPY --from=pg96-builder /usr/local/bin/psql /usr/local/pgsql-9.6/
|
||||
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_dump /usr/local/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_dumpall /usr/local/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/pg_restore /usr/local/pgsql-10/
|
||||
COPY --from=pg10-builder /usr/local/bin/psql /usr/local/pgsql-10/
|
||||
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_dump /usr/local/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_dumpall /usr/local/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/pg_restore /usr/local/pgsql-11/
|
||||
COPY --from=pg11-builder /usr/local/bin/psql /usr/local/pgsql-11/
|
||||
|
||||
WORKDIR /pgadmin4
|
||||
ENV PYTHONPATH=/pgadmin4
|
||||
|
||||
#Copy in the docs and JS/CSS bundles
|
||||
COPY --from=node-builder /pgadmin4/web/pgadmin/static/js/generated/ /pgadmin4/pgadmin/static/js/generated/
|
||||
COPY --from=docs-builder /pgadmin4/docs/en_US/_build/html/ /pgadmin4/docs/
|
||||
|
||||
# Install build-dependencies, build & install C extensions and purge deps in one RUN step
|
||||
# so that deps do not increase the size of resulting image by remaining in layers
|
||||
COPY ./pgadmin4/requirements.txt /pgadmin4
|
||||
RUN apk add --no-cache --virtual build-deps build-base postgresql-dev libffi-dev linux-headers && \
|
||||
apk add postfix postgresql-client postgresql-libs && \
|
||||
pip install --upgrade pip && \
|
||||
pip install --no-cache-dir -r requirements.txt && \
|
||||
pip install --no-cache-dir gunicorn && \
|
||||
apk del --no-cache build-deps
|
||||
|
||||
# Copy the code
|
||||
COPY ./pgadmin4/web /pgadmin4
|
||||
COPY ./run_pgadmin.py /pgadmin4
|
||||
COPY ./config_distro.py /pgadmin4
|
||||
COPY ./entrypoint.sh /entrypoint.sh
|
||||
|
||||
# Precompile and optimize python code to save time and space on startup
|
||||
RUN python -O -m compileall /pgadmin4
|
||||
|
||||
# Finish up
|
||||
VOLUME /var/lib/pgadmin
|
||||
EXPOSE 80 443
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -1,129 +1,24 @@
|
||||
This directory contains the files required to create a docker container running pgAdmin.
|
||||
This directory contains the files required to create a docker container running
|
||||
pgAdmin.
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
Whilst you can just use the Dockerfile directly, it requires that various pre-configuration steps are performed, for
|
||||
example, the pgAdmin web code must be copied to `./web`, Sphinx documentation source must be copied to `./docs`
|
||||
and `requirements.txt` is also expected to be in this directory.
|
||||
From the top level directory of the pgAdmin source tree, simply run:
|
||||
|
||||
The recommended (and easy) way to build the container is to do:
|
||||
docker build .
|
||||
|
||||
```console
|
||||
cd $PGADMIN_SRC/
|
||||
workon pgadmin-venv
|
||||
make docker
|
||||
```
|
||||
You can also run 'make docker', which will call 'docker build .' but also tag
|
||||
the image like:
|
||||
|
||||
This will call the build script $PGADMIN_SRC/pkg/docker/build.sh which will prepare a staging directory containing all
|
||||
the required files, then build the container and push it to your repo.
|
||||
pgadmin4 pgadmin4:latest pgadmin4:4 pgadmin4:4.12
|
||||
|
||||
WARNING: The build should be run in a CLEAN source tree. Whilst some potentially
|
||||
dangerous files such as config_local.py or log files will be explicitly
|
||||
excluded from the final image, other files will not be.
|
||||
|
||||
Running
|
||||
=======
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
The container will accept the following variables at startup:
|
||||
|
||||
*PGADMIN_DEFAULT_EMAIL*
|
||||
|
||||
This is the email address used when setting up the initial administrator account
|
||||
to login to pgAdmin. This variable is required and must be set at launch time.
|
||||
|
||||
*PGADMIN_DEFAULT_PASSWORD*
|
||||
|
||||
This is the password used when setting up the initial administrator account to
|
||||
login to pgAdmin. This variable is required and must be set at launch time.
|
||||
|
||||
*PGADMIN_ENABLE_TLS*
|
||||
|
||||
Default: <null>
|
||||
|
||||
If left un-set, the container will listen on port 80 for connections in plain
|
||||
text. If set to any value, the container will listen on port 443 for TLS
|
||||
connections.
|
||||
|
||||
When TLS is enabled, a certificate and key must be provided. Typically these
|
||||
should be stored on the host file system and mounted from the container. The
|
||||
expected paths are /certs/server.crt and /certs/server.key
|
||||
|
||||
*PGADMIN_LISTEN_PORT*
|
||||
|
||||
Default: 80 or 443 (if TLS is enabled)
|
||||
|
||||
Allows the port that the server listens on to be set to a specific value rather
|
||||
than using the default.
|
||||
|
||||
*GUNICORN_THREADS*
|
||||
|
||||
Default: 25
|
||||
|
||||
Adjust the number of threads the Gunicorn server uses to handle incoming
|
||||
requests. This should typically be left as-is, except in highly loaded systems
|
||||
where it may be increased.
|
||||
|
||||
Mapped Files and Directories
|
||||
----------------------------
|
||||
|
||||
The following files or directories can be mapped from the container onto the
|
||||
host machine to allow configuration to be customised and shared between
|
||||
instances:
|
||||
|
||||
*/var/lib/pgadmin*
|
||||
|
||||
This is the working directory in which pgAdmin stores session data, user files,
|
||||
configuration files, and it's configuration database. Mapping this directory
|
||||
onto the host machine gives you an easy way to maintain configuration between
|
||||
|
||||
invocations of the container.
|
||||
|
||||
*/pgadmin4/config_local.py*
|
||||
|
||||
This file can be used to override configuration settings in pgAdmin. Settings
|
||||
found in config.py can be overridden with deployment specific values if
|
||||
required.
|
||||
|
||||
*/pgadmin4/servers.json*
|
||||
|
||||
If this file is mapped, server definitions found in it will be loaded at launch
|
||||
time. This allows connection information to be pre-loaded into the instance of
|
||||
pgAdmin in the container.
|
||||
|
||||
*/certs/server.cert*
|
||||
|
||||
If TLS is enabled, this file will be used as the servers TLS certificate.
|
||||
|
||||
*/certs/server.key*
|
||||
|
||||
If TLS is enabled, this file will be used as the key file for the servers TLS
|
||||
certificate.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Run a simple container over port 80:
|
||||
|
||||
```
|
||||
docker pull dpage/pgadmin4
|
||||
docker run -p 80:80 \
|
||||
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
|
||||
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
|
||||
-d dpage/pgadmin4
|
||||
```
|
||||
Run a TLS secured container using a shared config/storage directory in
|
||||
/private/var/lib/pgadmin on the host, and servers pre-loaded from
|
||||
/tmp/servers.json on the host:
|
||||
|
||||
```
|
||||
docker pull dpage/pgadmin4
|
||||
docker run -p 443:443 \
|
||||
-v "/private/var/lib/pgadmin:/var/lib/pgadmin" \
|
||||
-v "/path/to/certificate.cert:/certs/server.cert" \
|
||||
-v "/path/to/certificate.key:/certs/server.key" \
|
||||
-v "/tmp/servers.json:/servers.json" \
|
||||
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
|
||||
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
|
||||
-e "PGADMIN_ENABLE_TLS=True" \
|
||||
-d dpage/pgadmin4
|
||||
```
|
||||
See the documentation at docs/en_US/container_deployment.rst for information on
|
||||
running the container.
|
||||
@@ -1,62 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# pgAdmin 4 - PostgreSQL Tools
|
||||
#
|
||||
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
||||
# This software is released under the PostgreSQL Licence
|
||||
#
|
||||
#########################################################################
|
||||
|
||||
# Runtime checks
|
||||
if [ ! -d runtime -a ! -d web ]; then
|
||||
echo This script must be run from the top-level directory of the source tree.
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d .git -a ! -f .git/config ]; then
|
||||
echo This script must be run from a git checkout of the source tree.
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the required package info
|
||||
APP_RELEASE=`grep "^APP_RELEASE" web/config.py | cut -d"=" -f2 | sed 's/ //g'`
|
||||
APP_REVISION=`grep "^APP_REVISION" web/config.py | cut -d"=" -f2 | sed 's/ //g'`
|
||||
APP_NAME=`grep "^APP_NAME" web/config.py | cut -d"=" -f2 | sed "s/'//g" | sed 's/^ //'`
|
||||
APP_LONG_VERSION=${APP_RELEASE}.${APP_REVISION}
|
||||
APP_SHORT_VERSION=`echo ${APP_LONG_VERSION} | cut -d . -f1,2`
|
||||
APP_SUFFIX=`grep "^APP_SUFFIX" web/config.py | cut -d"=" -f2 | sed 's/ //g' | sed "s/'//g"`
|
||||
if [ ! -z ${APP_SUFFIX} ]; then
|
||||
export APP_LONG_VERSION=${APP_LONG_VERSION}-${APP_SUFFIX}
|
||||
fi
|
||||
CONTAINER_NAME=`echo ${APP_NAME} | sed 's/ //g' | awk '{print tolower($0)}'`
|
||||
|
||||
# Output basic details to show we're working
|
||||
echo Building Docker Container for ${APP_NAME} version ${APP_LONG_VERSION}...
|
||||
|
||||
# Create/clearout the build directory
|
||||
echo Creating/cleaning required directories...
|
||||
if [ -d docker-build ]; then
|
||||
rm -rf docker-build
|
||||
fi
|
||||
|
||||
mkdir -p docker-build/pgadmin4
|
||||
|
||||
# Build the clean tree
|
||||
echo Copying source tree...
|
||||
git archive HEAD -- docs web requirements.txt | tar xvf - -C docker-build/pgadmin4
|
||||
|
||||
# Copy the Docker specific assets into place
|
||||
cp pkg/docker/Dockerfile \
|
||||
pkg/docker/entrypoint.sh \
|
||||
pkg/docker/config_distro.py \
|
||||
pkg/docker/run_pgadmin.py \
|
||||
pkg/docker/.dockerignore \
|
||||
docker-build/
|
||||
|
||||
# Build the container
|
||||
docker build docker-build -t ${CONTAINER_NAME} \
|
||||
-t ${CONTAINER_NAME}:latest \
|
||||
-t ${CONTAINER_NAME}:${APP_RELEASE} \
|
||||
-t ${CONTAINER_NAME}:${APP_LONG_VERSION}
|
||||
@@ -1,4 +0,0 @@
|
||||
HELP_PATH = '../../docs'
|
||||
DEFAULT_BINARY_PATHS = {
|
||||
'pg': '/usr/local/pgsql-11'
|
||||
}
|
||||
@@ -1,5 +1,23 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Create config_distro.py. This has some default config, as well as anything
|
||||
# provided by the user through the PGADMIN_CONFIG_* environment variables.
|
||||
# Only write the file on first launch.
|
||||
if [ ! -f /pgadmin4/config_distro.py ]; then
|
||||
cat << EOF > /pgadmin4/config_distro.py
|
||||
HELP_PATH = '../../docs'
|
||||
DEFAULT_BINARY_PATHS = {
|
||||
'pg': '/usr/local/pgsql-11'
|
||||
}
|
||||
EOF
|
||||
|
||||
# This is a bit kludgy, but necessary as the container uses BusyBox/ash as
|
||||
# it's shell and not bash which would allow a much cleaner implementation
|
||||
for var in $(env | grep PGADMIN_CONFIG_ | cut -d "=" -f 1); do
|
||||
echo ${var#PGADMIN_CONFIG_} = $(eval "echo \$$var") >> /pgadmin4/config_distro.py
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ! -f /var/lib/pgadmin/pgadmin4.db ]; then
|
||||
if [ -z "${PGADMIN_DEFAULT_EMAIL}" -o -z "${PGADMIN_DEFAULT_PASSWORD}" ]; then
|
||||
echo 'You need to specify PGADMIN_DEFAULT_EMAIL and PGADMIN_DEFAULT_PASSWORD environment variables'
|
||||
@@ -15,7 +33,7 @@ if [ ! -f /var/lib/pgadmin/pgadmin4.db ]; then
|
||||
# Importing pgadmin4 (from this script) is enough
|
||||
python run_pgadmin.py
|
||||
|
||||
export PGADMIN_SERVER_JSON_FILE=${PGADMIN_SERVER_JSON:-/pgadmin4/servers.json}
|
||||
export PGADMIN_SERVER_JSON_FILE=${PGADMIN_SERVER_JSON_FILE:-/pgadmin4/servers.json}
|
||||
# Pre-load any required servers
|
||||
if [ -f "${PGADMIN_SERVER_JSON_FILE}" ]; then
|
||||
/usr/local/bin/python /pgadmin4/setup.py --load-servers "${PGADMIN_SERVER_JSON_FILE}" --user ${PGADMIN_DEFAULT_EMAIL}
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
<key>CFBundleName</key>
|
||||
<string>pgAdmin 4</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.12.0</string>
|
||||
<string>4.13.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>4.12.0</string>
|
||||
<string>4.13.0</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.10</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION = 4.12.0.0
|
||||
VERSION = 4.13.0.0
|
||||
QMAKE_TARGET_COMPANY = "The pgAdmin Development Team"
|
||||
QMAKE_TARGET_PRODUCT = "pgAdmin 4"
|
||||
QMAKE_TARGET_DESCRIPTION = "pgAdmin 4 Desktop Runtime"
|
||||
|
||||
@@ -50,7 +50,7 @@ APP_ICON = 'pg-icon'
|
||||
|
||||
# Application version number components
|
||||
APP_RELEASE = 4
|
||||
APP_REVISION = 12
|
||||
APP_REVISION = 13
|
||||
|
||||
# Application version suffix, e.g. 'beta1', 'dev'. Usually an empty string
|
||||
# for GA releases.
|
||||
@@ -59,7 +59,7 @@ APP_SUFFIX = ''
|
||||
# Numeric application version for upgrade checks. Should be in the format:
|
||||
# [X]XYYZZ, where X is the release version, Y is the revision, with a leading
|
||||
# zero if needed, and Z represents the suffix, with a leading zero if needed
|
||||
APP_VERSION_INT = 41200
|
||||
APP_VERSION_INT = 41300
|
||||
|
||||
# DO NOT CHANGE!
|
||||
# The application version string, constructed from the components
|
||||
@@ -85,6 +85,7 @@ LANGUAGES = {
|
||||
'zh': 'Chinese (Simplified)',
|
||||
'fr': 'French',
|
||||
'de': 'German',
|
||||
'it': 'Italian',
|
||||
'ja': 'Japanese',
|
||||
'ko': 'Korean',
|
||||
'pl': 'Polish',
|
||||
@@ -163,6 +164,9 @@ SECURITY_PASSWORD_HASH = 'pbkdf2_sha512'
|
||||
# has no effect on <= Python 2.7.
|
||||
MINIFY_PAGE = True
|
||||
|
||||
# Set the cache control max age for static files in flask to 1 year
|
||||
SEND_FILE_MAX_AGE_DEFAULT = 31556952
|
||||
|
||||
# This will be added to static urls as url parameter with value as
|
||||
# APP_VERSION_INT for cache busting on version upgrade. If the value is set as
|
||||
# None or empty string then it will not be added.
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
|
||||
"""Change the not null constraints for port, username as it should not
|
||||
compulsory when service is provided. RM #4642
|
||||
|
||||
Revision ID: a77a0932a568
|
||||
Revises: 35f29b1701bd
|
||||
Create Date: 2019-09-09 15:41:30.084753
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from pgadmin.model import db
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'a77a0932a568'
|
||||
down_revision = '35f29b1701bd'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# To Save previous data
|
||||
db.engine.execute("ALTER TABLE server RENAME TO server_old")
|
||||
|
||||
# Create table with drop constraint for port and username definition
|
||||
db.engine.execute("""
|
||||
CREATE TABLE server (
|
||||
id INTEGER NOT NULL,
|
||||
user_id INTEGER NOT NULL,
|
||||
servergroup_id INTEGER NOT NULL,
|
||||
name VARCHAR(128) NOT NULL,
|
||||
host VARCHAR(128),
|
||||
port INTEGER,
|
||||
maintenance_db VARCHAR(64) NOT NULL,
|
||||
username VARCHAR(64),
|
||||
password VARCHAR(64),
|
||||
role VARCHAR(64),
|
||||
ssl_mode VARCHAR(16) NOT NULL CHECK(ssl_mode IN
|
||||
( 'allow' , 'prefer' , 'require' , 'disable' ,
|
||||
'verify-ca' , 'verify-full' )
|
||||
),
|
||||
comment VARCHAR(1024),
|
||||
discovery_id VARCHAR(128),
|
||||
hostaddr TEXT(1024),
|
||||
db_res TEXT,
|
||||
passfile TEXT,
|
||||
sslcert TEXT,
|
||||
sslkey TEXT,
|
||||
sslrootcert TEXT,
|
||||
sslcrl TEXT,
|
||||
sslcompression INTEGER DEFAULT 0,
|
||||
bgcolor TEXT(10),
|
||||
fgcolor TEXT(10),
|
||||
service TEXT,
|
||||
use_ssh_tunnel INTEGER DEFAULT 0,
|
||||
tunnel_host TEXT,
|
||||
tunnel_port TEXT,
|
||||
tunnel_username TEXT,
|
||||
tunnel_authentication INTEGER DEFAULT 0,
|
||||
tunnel_identity_file TEXT, connect_timeout INTEGER DEFAULT 0, tunnel_password TEXT(64),
|
||||
PRIMARY KEY(id),
|
||||
FOREIGN KEY(user_id) REFERENCES user(id),
|
||||
FOREIGN KEY(servergroup_id) REFERENCES servergroup(id)
|
||||
)
|
||||
""")
|
||||
|
||||
# Copy old data again into table
|
||||
db.engine.execute("""
|
||||
INSERT INTO server (
|
||||
id, user_id, servergroup_id, name, host, port, maintenance_db,
|
||||
username, password, role, ssl_mode, comment, discovery_id, hostaddr,
|
||||
db_res, passfile, sslcert, sslkey, sslrootcert, sslcrl,
|
||||
sslcompression, bgcolor, fgcolor, service, use_ssh_tunnel,
|
||||
tunnel_host, tunnel_port, tunnel_username, tunnel_authentication,
|
||||
tunnel_identity_file
|
||||
|
||||
) SELECT
|
||||
id, user_id, servergroup_id, name, host, port, maintenance_db,
|
||||
username, password, role, ssl_mode, comment, discovery_id, hostaddr,
|
||||
db_res, passfile, sslcert, sslkey, sslrootcert, sslcrl,
|
||||
sslcompression, bgcolor, fgcolor, service, use_ssh_tunnel,
|
||||
tunnel_host, tunnel_port, tunnel_username, tunnel_authentication,
|
||||
tunnel_identity_file
|
||||
FROM server_old""")
|
||||
|
||||
# Remove old data
|
||||
db.engine.execute("DROP TABLE server_old")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
@@ -723,9 +723,8 @@ class ServerNode(PGChildNodeView):
|
||||
"""Add a server node to the settings database"""
|
||||
required_args = [
|
||||
u'name',
|
||||
u'port',
|
||||
u'db',
|
||||
u'sslmode',
|
||||
u'username'
|
||||
]
|
||||
|
||||
data = request.form if request.form else json.loads(
|
||||
@@ -741,7 +740,8 @@ class ServerNode(PGChildNodeView):
|
||||
if 'service' in data and not data['service']:
|
||||
required_args.extend([
|
||||
u'host',
|
||||
u'db',
|
||||
u'port',
|
||||
u'username',
|
||||
u'role'
|
||||
])
|
||||
for arg in required_args:
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
COMMENT ON CAST (money AS bigint)
|
||||
IS 'Cast from money to bigint';
|
||||
@@ -0,0 +1,2 @@
|
||||
COMMENT ON CAST (money AS bigint)
|
||||
IS 'Cast from money to bigint';
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE CAST (money AS bigint)
|
||||
WITHOUT FUNCTION;
|
||||
@@ -0,0 +1,3 @@
|
||||
CREATE CAST (money AS bigint)
|
||||
WITHOUT FUNCTION
|
||||
AS IMPLICIT;
|
||||
@@ -5,6 +5,7 @@
|
||||
"name": "Create IMPLICIT Cast",
|
||||
"endpoint": "NODE-cast.obj",
|
||||
"sql_endpoint": "NODE-cast.sql_id",
|
||||
"msql_endpoint": "NODE-cast.msql",
|
||||
"data": {
|
||||
"castcontext": "IMPLICIT",
|
||||
"encoding": "UTF8",
|
||||
@@ -12,17 +13,20 @@
|
||||
"srctyp": "money",
|
||||
"trgtyp": "bigint"
|
||||
},
|
||||
"expected_sql_file": "create_implicit_cast.sql"
|
||||
"expected_sql_file": "create_implicit_cast.sql",
|
||||
"expected_msql_file": "create_implicit_cast_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter IMPLICIT Cast",
|
||||
"endpoint": "NODE-cast.obj_id",
|
||||
"sql_endpoint": "NODE-cast.sql_id",
|
||||
"msql_endpoint": "NODE-cast.msql_id",
|
||||
"data": {
|
||||
"description": "Cast from money to bigint"
|
||||
},
|
||||
"expected_sql_file": "alter_implicit_cast.sql"
|
||||
"expected_sql_file": "alter_implicit_cast.sql",
|
||||
"expected_msql_file": "alter_implicit_cast_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "delete",
|
||||
@@ -37,6 +41,7 @@
|
||||
"name":"Create EXPLICIT Cast",
|
||||
"endpoint": "NODE-cast.obj",
|
||||
"sql_endpoint": "NODE-cast.sql_id",
|
||||
"msql_endpoint": "NODE-cast.msql",
|
||||
"data": {
|
||||
"castcontext": "EXPLICIT",
|
||||
"encoding": "UTF8",
|
||||
@@ -44,17 +49,20 @@
|
||||
"srctyp": "money",
|
||||
"trgtyp": "bigint"
|
||||
},
|
||||
"expected_sql": "-- Cast: money -> bigint\n\n-- DROP CAST (money AS bigint);\n\nCREATE CAST (money AS bigint)\n\tWITHOUT FUNCTION;"
|
||||
"expected_sql": "-- Cast: money -> bigint\n\n-- DROP CAST (money AS bigint);\n\nCREATE CAST (money AS bigint)\n\tWITHOUT FUNCTION;",
|
||||
"expected_msql_file": "create_explicit_cast_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter EXPLICIT Cast",
|
||||
"endpoint": "NODE-cast.obj_id",
|
||||
"sql_endpoint": "NODE-cast.sql_id",
|
||||
"msql_endpoint": "NODE-cast.msql_id",
|
||||
"data": {
|
||||
"description": "Cast from money to bigint"
|
||||
},
|
||||
"expected_sql": "-- Cast: money -> bigint\n\n-- DROP CAST (money AS bigint);\n\nCREATE CAST (money AS bigint)\n\tWITHOUT FUNCTION;\n\nCOMMENT ON CAST (money AS bigint) IS 'Cast from money to bigint';"
|
||||
"expected_sql": "-- Cast: money -> bigint\n\n-- DROP CAST (money AS bigint);\n\nCREATE CAST (money AS bigint)\n\tWITHOUT FUNCTION;\n\nCOMMENT ON CAST (money AS bigint) IS 'Cast from money to bigint';",
|
||||
"expected_msql_file": "alter_explicit_cast_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "delete",
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER EXTENSION sslinfo
|
||||
SET SCHEMA public;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER EXTENSION citext
|
||||
UPDATE TO "1.1";
|
||||
@@ -0,0 +1,3 @@
|
||||
CREATE EXTENSION sslinfo
|
||||
SCHEMA test_extension_schema
|
||||
VERSION "1.0";
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE EXTENSION citext
|
||||
VERSION "1.0";
|
||||
@@ -5,23 +5,27 @@
|
||||
"name": "Create Extension with all options",
|
||||
"endpoint": "NODE-extension.obj",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql",
|
||||
"data": {
|
||||
"name": "sslinfo",
|
||||
"schema": "test_extension_schema",
|
||||
"version": "1.0"
|
||||
},
|
||||
"expected_sql_file": "create_extension_with_all_options.sql",
|
||||
"expected_msql_file": "msql_create_extension_with_all_options.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter Extension version",
|
||||
"name": "Alter Extension schema",
|
||||
"endpoint": "NODE-extension.obj_id",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql_id",
|
||||
"data": {
|
||||
"schema": "public"
|
||||
},
|
||||
"expected_sql_file": "alter_extension_schema.sql",
|
||||
"expected_msql_file": "msql_alter_extension_schema.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
@@ -36,11 +40,13 @@
|
||||
"name": "Create Extension with default schema",
|
||||
"endpoint": "NODE-extension.obj",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql",
|
||||
"data": {
|
||||
"name": "citext",
|
||||
"version": "1.0"
|
||||
},
|
||||
"expected_sql_file": "create_extension_with_default_schema.sql",
|
||||
"expected_msql_file": "msql_create_extension_with_default_schema.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='citext' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
@@ -48,10 +54,12 @@
|
||||
"name": "Alter Extension version",
|
||||
"endpoint": "NODE-extension.obj_id",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql_id",
|
||||
"data": {
|
||||
"version": "1.1"
|
||||
},
|
||||
"expected_sql_file": "alter_extension_version.sql",
|
||||
"expected_msql_file": "msql_alter_extension_version.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='citext' and e2.version='1.1';"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER EXTENSION sslinfo
|
||||
SET SCHEMA public;
|
||||
@@ -0,0 +1,3 @@
|
||||
CREATE EXTENSION sslinfo
|
||||
SCHEMA test_extension_schema
|
||||
VERSION "1.0";
|
||||
@@ -5,23 +5,27 @@
|
||||
"name": "Create Extension with all options",
|
||||
"endpoint": "NODE-extension.obj",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql",
|
||||
"data": {
|
||||
"name": "sslinfo",
|
||||
"schema": "test_extension_schema",
|
||||
"version": "1.0"
|
||||
},
|
||||
"expected_sql_file": "create_extension_with_all_options.sql",
|
||||
"expected_msql_file": "msql_create_extension_with_all_options.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter Extension version",
|
||||
"name": "Alter Extension schema",
|
||||
"endpoint": "NODE-extension.obj_id",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql_id",
|
||||
"data": {
|
||||
"schema": "public"
|
||||
},
|
||||
"expected_sql_file": "alter_extension_schema.sql",
|
||||
"expected_msql_file": "msql_alter_extension_schema.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER EXTENSION sslinfo
|
||||
SET SCHEMA public;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER EXTENSION adminpack
|
||||
UPDATE TO "1.1";
|
||||
@@ -0,0 +1,3 @@
|
||||
CREATE EXTENSION sslinfo
|
||||
SCHEMA test_extension_schema
|
||||
VERSION "1.2";
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE EXTENSION adminpack
|
||||
VERSION "1.0";
|
||||
@@ -5,23 +5,27 @@
|
||||
"name": "Create Extension with all options",
|
||||
"endpoint": "NODE-extension.obj",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql",
|
||||
"data": {
|
||||
"name": "sslinfo",
|
||||
"schema": "test_extension_schema",
|
||||
"version": "1.2"
|
||||
},
|
||||
"expected_sql_file": "create_extension_with_all_options.sql",
|
||||
"expected_msql_file": "msql_create_extension_with_all_options.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.2';"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter Extension version",
|
||||
"name": "Alter Extension schema",
|
||||
"endpoint": "NODE-extension.obj_id",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql_id",
|
||||
"data": {
|
||||
"schema": "public"
|
||||
},
|
||||
"expected_sql_file": "alter_extension_schema.sql",
|
||||
"expected_msql_file": "msql_alter_extension_schema.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='sslinfo' and e2.version='1.2';"
|
||||
},
|
||||
{
|
||||
@@ -36,11 +40,13 @@
|
||||
"name": "Create Extension with default schema",
|
||||
"endpoint": "NODE-extension.obj",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql",
|
||||
"data": {
|
||||
"name": "adminpack",
|
||||
"version": "1.0"
|
||||
},
|
||||
"expected_sql_file": "create_extension_with_default_schema.sql",
|
||||
"expected_msql_file": "msql_create_extension_with_default_schema.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='adminpack' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
@@ -48,10 +54,12 @@
|
||||
"name": "Alter Extension version",
|
||||
"endpoint": "NODE-extension.obj_id",
|
||||
"sql_endpoint": "NODE-extension.sql_id",
|
||||
"msql_endpoint": "NODE-extension.msql_id",
|
||||
"data": {
|
||||
"version": "1.1"
|
||||
},
|
||||
"expected_sql_file": "alter_extension_version.sql",
|
||||
"expected_msql_file": "msql_alter_extension_version.sql",
|
||||
"precondition_sql": "select count(e1.name) \nfrom pg_available_extensions e1, pg_available_extension_versions e2\nwhere e1.name = e2.name and e1.name='adminpack' and e2.version='1.0';"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -19,3 +19,4 @@ FROM
|
||||
LEFT JOIN pg_catalog.pg_roles g ON (d.grantor = g.oid)
|
||||
LEFT JOIN pg_catalog.pg_roles gt ON (d.grantee = gt.oid)
|
||||
GROUP BY g.rolname, gt.rolname
|
||||
ORDER BY grantee
|
||||
@@ -15,7 +15,6 @@ CREATE SERVER {{ conn|qtIdent(data.name) }}{% if data.fsrvtype %}
|
||||
|
||||
{# ============= Set the owner for foreign server ============= #}
|
||||
{% if data.fsrvowner %}
|
||||
|
||||
ALTER SERVER {{ conn|qtIdent(data.name) }}
|
||||
OWNER TO {{ conn|qtIdent(data.fsrvowner) }};
|
||||
{% endif %}
|
||||
|
||||
@@ -31,4 +31,4 @@ COMMENT ON SERVER {{ conn|qtIdent(data.name) }}
|
||||
{% for priv in data.fsrvacl %}
|
||||
{{ PRIVILEGE.APPLY(conn, 'FOREIGN SERVER', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}{% endfor %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
@@ -0,0 +1,13 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs;
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO postgres;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
@@ -0,0 +1,5 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION 1.1;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
@@ -0,0 +1,18 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO postgres;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO postgres;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OPTIONS (ADD host '192.168.1.1', ADD dbname 'edb', ADD port '5450');
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
@@ -0,0 +1,15 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs;
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO postgres;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO postgres;
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OPTIONS (DROP host, DROP dbname, DROP port);
|
||||
|
||||
REVOKE ALL ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" FROM PUBLIC;
|
||||
@@ -0,0 +1,18 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
TYPE 'oracle'
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO postgres;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO postgres;
|
||||
@@ -0,0 +1,13 @@
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
TYPE 'oracle'
|
||||
VERSION 1.1
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO postgres;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"scenarios": [
|
||||
{
|
||||
"type": "create",
|
||||
"name": "Create FDW for foreign server",
|
||||
"endpoint": "NODE-foreign_data_wrapper.obj",
|
||||
"sql_endpoint": "NODE-foreign_data_wrapper.sql_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_fs",
|
||||
"fdwacl": [],
|
||||
"fdwoptions": []
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server with all options",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql",
|
||||
"data": {
|
||||
"name":"FS_$%{}[]()&*^!@\"'`\\/#",
|
||||
"fsrvtype":"oracle",
|
||||
"fsrvversion":"1.1",
|
||||
"fsrvoptions":[
|
||||
{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}],
|
||||
"fsrvowner":"postgres",
|
||||
"description":"Test comment",
|
||||
"fsrvacl":[{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"postgres",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
},
|
||||
"expected_sql_file": "create_fs_all_options.sql",
|
||||
"expected_msql_file": "create_fs_all_options_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "FS_$%{}[]()&*^!@\"'`\\/#"
|
||||
}
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"data": {
|
||||
"name":"FS_$%{}[]()&*^!@\"'`\\/#",
|
||||
"fsrvowner":"postgres"
|
||||
}
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server comment and version",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvversion":"1.1",
|
||||
"description":"Test comment"
|
||||
},
|
||||
"expected_sql_file": "alter_comment_version.sql",
|
||||
"expected_msql_file": "alter_comment_version_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server add options and privileges",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvoptions":{
|
||||
"added": [{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}]
|
||||
},
|
||||
"fsrvacl":{
|
||||
"added": [{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"postgres",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options_privileges.sql",
|
||||
"expected_msql_file": "alter_options_privileges_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server add options and privileges",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvoptions":{
|
||||
"deleted": [{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}]
|
||||
},
|
||||
"fsrvacl":{
|
||||
"deleted": [{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"postgres",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_remove_options_priv.sql",
|
||||
"expected_msql_file": "alter_remove_options_priv_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "FS_$%{}[]()&*^!@\"'`\\/#"
|
||||
}
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop FDW",
|
||||
"endpoint": "NODE-foreign_data_wrapper.delete_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_fs"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs;
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO enterprisedb;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
@@ -0,0 +1,5 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION 1.1;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
@@ -0,0 +1,18 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO enterprisedb;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO enterprisedb;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OPTIONS (ADD host '192.168.1.1', ADD dbname 'edb', ADD port '5450');
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
@@ -0,0 +1,15 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs;
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO enterprisedb;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO enterprisedb;
|
||||
@@ -0,0 +1,4 @@
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OPTIONS (DROP host, DROP dbname, DROP port);
|
||||
|
||||
REVOKE ALL ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" FROM PUBLIC;
|
||||
@@ -0,0 +1,18 @@
|
||||
-- Foreign Server: FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP SERVER FS_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
TYPE 'oracle'
|
||||
VERSION '1.1'
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO enterprisedb;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO enterprisedb;
|
||||
@@ -0,0 +1,13 @@
|
||||
CREATE SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
TYPE 'oracle'
|
||||
VERSION 1.1
|
||||
FOREIGN DATA WRAPPER test_fdw_for_fs
|
||||
OPTIONS (host '192.168.1.1', dbname 'edb', port '5450');
|
||||
|
||||
ALTER SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO enterprisedb;
|
||||
|
||||
COMMENT ON SERVER "FS_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'Test comment';
|
||||
|
||||
GRANT USAGE ON FOREIGN SERVER "FS_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"scenarios": [
|
||||
{
|
||||
"type": "create",
|
||||
"name": "Create FDW for foreign server",
|
||||
"endpoint": "NODE-foreign_data_wrapper.obj",
|
||||
"sql_endpoint": "NODE-foreign_data_wrapper.sql_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_fs",
|
||||
"fdwacl": [],
|
||||
"fdwoptions": []
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server with all options",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql",
|
||||
"data": {
|
||||
"name":"FS_$%{}[]()&*^!@\"'`\\/#",
|
||||
"fsrvtype":"oracle",
|
||||
"fsrvversion":"1.1",
|
||||
"fsrvoptions":[
|
||||
{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}],
|
||||
"fsrvowner":"enterprisedb",
|
||||
"description":"Test comment",
|
||||
"fsrvacl":[{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"enterprisedb",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
},
|
||||
"expected_sql_file": "create_fs_all_options.sql",
|
||||
"expected_msql_file": "create_fs_all_options_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "FS_$%{}[]()&*^!@\"'`\\/#"
|
||||
}
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"data": {
|
||||
"name":"FS_$%{}[]()&*^!@\"'`\\/#",
|
||||
"fsrvowner":"enterprisedb"
|
||||
}
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server comment and version",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvversion":"1.1",
|
||||
"description":"Test comment"
|
||||
},
|
||||
"expected_sql_file": "alter_comment_version.sql",
|
||||
"expected_msql_file": "alter_comment_version_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server add options and privileges",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvoptions":{
|
||||
"added": [{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}]
|
||||
},
|
||||
"fsrvacl":{
|
||||
"added": [{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"enterprisedb",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options_privileges.sql",
|
||||
"expected_msql_file": "alter_options_privileges_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter foreign server add options and privileges",
|
||||
"endpoint": "NODE-foreign_server.obj_id",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"msql_endpoint": "NODE-foreign_server.msql_id",
|
||||
"data": {
|
||||
"fsrvoptions":{
|
||||
"deleted": [{
|
||||
"fsrvoption":"host",
|
||||
"fsrvvalue":"192.168.1.1"
|
||||
},{
|
||||
"fsrvoption":"dbname",
|
||||
"fsrvvalue":"edb"
|
||||
},{
|
||||
"fsrvoption":"port",
|
||||
"fsrvvalue":"5450"
|
||||
}]
|
||||
},
|
||||
"fsrvacl":{
|
||||
"deleted": [{
|
||||
"grantee":"PUBLIC",
|
||||
"grantor":"enterprisedb",
|
||||
"privileges":[{
|
||||
"privilege_type":"U",
|
||||
"privilege":true,
|
||||
"with_grant":false
|
||||
}]
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_remove_options_priv.sql",
|
||||
"expected_msql_file": "alter_remove_options_priv_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "FS_$%{}[]()&*^!@\"'`\\/#"
|
||||
}
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop FDW",
|
||||
"endpoint": "NODE-foreign_data_wrapper.delete_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_fs"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
-- User Mapping : postgres
|
||||
|
||||
-- DROP USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user12', password 'secret123');
|
||||
@@ -0,0 +1,5 @@
|
||||
-- User Mapping : postgres
|
||||
|
||||
-- DROP USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR postgres SERVER test_fs_for_user_mapping;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
OPTIONS (DROP "user", DROP password);
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
OPTIONS (SET "user" 'test_user12', SET password 'secret123');
|
||||
@@ -0,0 +1,6 @@
|
||||
-- User Mapping : postgres
|
||||
|
||||
-- DROP USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user', password 'secret');
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE USER MAPPING FOR postgres SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user', password 'secret');
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"scenarios": [
|
||||
{
|
||||
"type": "create",
|
||||
"name": "Create FDW for user mapping",
|
||||
"endpoint": "NODE-foreign_data_wrapper.obj",
|
||||
"sql_endpoint": "NODE-foreign_data_wrapper.sql_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_user_mapping",
|
||||
"fdwacl": [],
|
||||
"fdwoptions": []
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server for user mapping",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"data": {
|
||||
"name":"test_fs_for_user_mapping"
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create User Mapping",
|
||||
"endpoint": "NODE-user_mapping.obj",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql",
|
||||
"data": {
|
||||
"name": "postgres",
|
||||
"umoptions":[{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret"
|
||||
}]
|
||||
},
|
||||
"expected_sql_file": "create_user_mapping.sql",
|
||||
"expected_msql_file": "create_user_mapping_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter user mapping options",
|
||||
"endpoint": "NODE-user_mapping.obj_id",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql_id",
|
||||
"data": {
|
||||
"umoptions":{
|
||||
"changed": [{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user12"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret123"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options.sql",
|
||||
"expected_msql_file": "alter_options_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter user mapping drop options",
|
||||
"endpoint": "NODE-user_mapping.obj_id",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql_id",
|
||||
"data": {
|
||||
"umoptions":{
|
||||
"deleted": [{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user12"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret123"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options_deleted.sql",
|
||||
"expected_msql_file": "alter_options_deleted_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop user mapping",
|
||||
"endpoint": "NODE-user_mapping.delete_id"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "test_fs_for_user_mapping"
|
||||
}
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop FDW",
|
||||
"endpoint": "NODE-foreign_data_wrapper.delete_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_user_mapping"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
-- User Mapping : enterprisedb
|
||||
|
||||
-- DROP USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user12', password 'secret123');
|
||||
@@ -0,0 +1,5 @@
|
||||
-- User Mapping : enterprisedb
|
||||
|
||||
-- DROP USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
OPTIONS (DROP "user", DROP password);
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
OPTIONS (SET "user" 'test_user12', SET password 'secret123');
|
||||
@@ -0,0 +1,6 @@
|
||||
-- User Mapping : enterprisedb
|
||||
|
||||
-- DROP USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
|
||||
CREATE USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user', password 'secret');
|
||||
@@ -0,0 +1,2 @@
|
||||
CREATE USER MAPPING FOR enterprisedb SERVER test_fs_for_user_mapping
|
||||
OPTIONS ("user" 'test_user', password 'secret');
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"scenarios": [
|
||||
{
|
||||
"type": "create",
|
||||
"name": "Create FDW for user mapping",
|
||||
"endpoint": "NODE-foreign_data_wrapper.obj",
|
||||
"sql_endpoint": "NODE-foreign_data_wrapper.sql_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_user_mapping",
|
||||
"fdwacl": [],
|
||||
"fdwoptions": []
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create foreign server for user mapping",
|
||||
"endpoint": "NODE-foreign_server.obj",
|
||||
"sql_endpoint": "NODE-foreign_server.sql_id",
|
||||
"data": {
|
||||
"name":"test_fs_for_user_mapping"
|
||||
},
|
||||
"store_object_id": "True"
|
||||
}, {
|
||||
"type": "create",
|
||||
"name": "Create User Mapping",
|
||||
"endpoint": "NODE-user_mapping.obj",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql",
|
||||
"data": {
|
||||
"name": "enterprisedb",
|
||||
"umoptions":[{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret"
|
||||
}]
|
||||
},
|
||||
"expected_sql_file": "create_user_mapping.sql",
|
||||
"expected_msql_file": "create_user_mapping_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter user mapping options",
|
||||
"endpoint": "NODE-user_mapping.obj_id",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql_id",
|
||||
"data": {
|
||||
"umoptions":{
|
||||
"changed": [{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user12"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret123"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options.sql",
|
||||
"expected_msql_file": "alter_options_msql.sql"
|
||||
}, {
|
||||
"type": "alter",
|
||||
"name": "Alter user mapping drop options",
|
||||
"endpoint": "NODE-user_mapping.obj_id",
|
||||
"sql_endpoint": "NODE-user_mapping.sql_id",
|
||||
"msql_endpoint": "NODE-user_mapping.msql_id",
|
||||
"data": {
|
||||
"umoptions":{
|
||||
"deleted": [{
|
||||
"umoption":"user",
|
||||
"umvalue":"test_user12"
|
||||
},{
|
||||
"umoption":"password",
|
||||
"umvalue":"secret123"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_options_deleted.sql",
|
||||
"expected_msql_file": "alter_options_deleted_msql.sql"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop user mapping",
|
||||
"endpoint": "NODE-user_mapping.delete_id"
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop foreign server",
|
||||
"endpoint": "NODE-foreign_server.delete_id",
|
||||
"data": {
|
||||
"name": "test_fs_for_user_mapping"
|
||||
}
|
||||
}, {
|
||||
"type": "delete",
|
||||
"name": "Drop FDW",
|
||||
"endpoint": "NODE-foreign_data_wrapper.delete_id",
|
||||
"data": {
|
||||
"name": "test_fdw_for_user_mapping"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
COMMENT ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'This is comment on custom trusted language';
|
||||
|
||||
GRANT USAGE ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
|
||||
GRANT USAGE ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" TO postgres WITH GRANT OPTION;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- Language: Lan2_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator;
|
||||
|
||||
ALTER LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO <OWNER>;
|
||||
|
||||
COMMENT ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'This is comment on custom trusted language';
|
||||
@@ -0,0 +1,2 @@
|
||||
REVOKE ALL ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" FROM PUBLIC;
|
||||
REVOKE ALL ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" FROM postgres;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
RENAME TO "Lan2_$%{}[]()&*^!@""'`\/#";
|
||||
@@ -0,0 +1,5 @@
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator
|
||||
;
|
||||
@@ -0,0 +1,5 @@
|
||||
CREATE PROCEDURAL LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator
|
||||
;
|
||||
@@ -5,6 +5,7 @@
|
||||
"name": "Create trusted language",
|
||||
"endpoint": "NODE-language.obj",
|
||||
"sql_endpoint": "NODE-language.sql_id",
|
||||
"msql_endpoint": "NODE-language.msql",
|
||||
"data": {
|
||||
"name": "Lan1_$%{}[]()&*^!@\"'`\\/#",
|
||||
"trusted": true,
|
||||
@@ -13,23 +14,27 @@
|
||||
"lanval": "plpgsql_validator",
|
||||
"is_template": false
|
||||
},
|
||||
"expected_sql_file": "create_trusted_language.sql"
|
||||
"expected_sql_file": "create_trusted_language.sql",
|
||||
"expected_msql_file": "create_trusted_language_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter trusted language name",
|
||||
"endpoint": "NODE-language.obj_id",
|
||||
"sql_endpoint": "NODE-language.sql_id",
|
||||
"msql_endpoint": "NODE-language.msql_id",
|
||||
"data": {
|
||||
"name": "Lan2_$%{}[]()&*^!@\"'`\\/#"
|
||||
},
|
||||
"expected_sql_file": "alter_trusted_lan_name.sql"
|
||||
"expected_sql_file": "alter_trusted_lan_name.sql",
|
||||
"expected_msql_file": "alter_trusted_lan_name_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "alter",
|
||||
"name": "Alter comment and privileges",
|
||||
"endpoint": "NODE-language.obj_id",
|
||||
"sql_endpoint": "NODE-language.sql_id",
|
||||
"msql_endpoint": "NODE-language.msql_id",
|
||||
"data": {
|
||||
"description": "This is comment on custom trusted language",
|
||||
"lanacl": {
|
||||
@@ -53,7 +58,38 @@
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_comment_privileges.sql"
|
||||
"expected_sql_file": "alter_comment_privileges.sql",
|
||||
"expected_msql_file": "alter_comment_privileges_msql.sql"
|
||||
},{
|
||||
"type": "alter",
|
||||
"name": "Alter revoke privileges",
|
||||
"endpoint": "NODE-language.obj_id",
|
||||
"sql_endpoint": "NODE-language.sql_id",
|
||||
"msql_endpoint": "NODE-language.msql_id",
|
||||
"data": {
|
||||
"lanacl": {
|
||||
"deleted":[{
|
||||
"grantee": "PUBLIC",
|
||||
"grantor": "postgres",
|
||||
"privileges":[
|
||||
{
|
||||
"privilege_type": "U",
|
||||
"privilege": true,
|
||||
"with_grant": false
|
||||
}]
|
||||
},{
|
||||
"grantee": "postgres",
|
||||
"grantor": "postgres",
|
||||
"privileges":[{
|
||||
"privilege_type": "U",
|
||||
"privilege": true,
|
||||
"with_grant": true
|
||||
}]
|
||||
}]
|
||||
}
|
||||
},
|
||||
"expected_sql_file": "alter_revoke_privileges.sql",
|
||||
"expected_msql_file": "alter_revoke_privileges_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "delete",
|
||||
@@ -66,6 +102,7 @@
|
||||
"name": "Create untrusted language",
|
||||
"endpoint": "NODE-language.obj",
|
||||
"sql_endpoint": "NODE-language.sql_id",
|
||||
"msql_endpoint": "NODE-language.msql",
|
||||
"data": {
|
||||
"name": "Lan1_$%{}[]()&*^!@\"'`\\/#",
|
||||
"trusted": false,
|
||||
@@ -74,7 +111,8 @@
|
||||
"lanval": "plpgsql_validator",
|
||||
"is_template": false
|
||||
},
|
||||
"expected_sql_file": "create_untrusted_language.sql"
|
||||
"expected_sql_file": "create_untrusted_language.sql",
|
||||
"expected_msql_file": "create_untrusted_language_msql.sql"
|
||||
},
|
||||
{
|
||||
"type": "delete",
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
-- DROP LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER spl_call_handler
|
||||
INLINE spl_inline_handler
|
||||
VALIDATOR spl_validator;
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator;
|
||||
|
||||
ALTER LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO <OWNER>;
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
COMMENT ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'This is comment on custom trusted language';
|
||||
|
||||
GRANT USAGE ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" TO PUBLIC;
|
||||
|
||||
GRANT USAGE ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" TO enterprisedb WITH GRANT OPTION;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- Language: Lan2_$%{}[]()&*^!@"'`\/#
|
||||
|
||||
-- DROP LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator;
|
||||
|
||||
ALTER LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO <OWNER>;
|
||||
|
||||
COMMENT ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
IS 'This is comment on custom trusted language';
|
||||
@@ -0,0 +1,2 @@
|
||||
REVOKE ALL ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" FROM PUBLIC;
|
||||
REVOKE ALL ON LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#" FROM enterprisedb;
|
||||
@@ -3,9 +3,9 @@
|
||||
-- DROP LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER spl_call_handler
|
||||
INLINE spl_inline_handler
|
||||
VALIDATOR spl_validator;
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator;
|
||||
|
||||
ALTER LANGUAGE "Lan2_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO <OWNER>;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
RENAME TO "Lan2_$%{}[]()&*^!@""'`\/#";
|
||||
@@ -3,9 +3,9 @@
|
||||
-- DROP LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
|
||||
CREATE TRUSTED PROCEDURAL LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
HANDLER spl_call_handler
|
||||
INLINE spl_inline_handler
|
||||
VALIDATOR spl_validator;
|
||||
HANDLER plpgsql_call_handler
|
||||
INLINE plpgsql_inline_handler
|
||||
VALIDATOR plpgsql_validator;
|
||||
|
||||
ALTER LANGUAGE "Lan1_$%{}[]()&*^!@""'`\/#"
|
||||
OWNER TO <OWNER>;
|
||||