diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 01788442da6..7cda50ceec5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,14 +11,14 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-12] steps: - uses: actions/checkout@v3 - name: dependancy - linux if: ${{ matrix.os == 'ubuntu-latest' }} run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ @@ -35,7 +35,7 @@ jobs: --with-ossp-uuid --with-libxml --with-libxslt --with-perl \ --with-icu - name: configure - macos - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-12' }} run: | export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" ./configure \ diff --git a/.github/workflows/contrib_regression.yml b/.github/workflows/contrib_regression.yml index 2fde426e707..5d60cdaee82 100644 --- a/.github/workflows/contrib_regression.yml +++ b/.github/workflows/contrib_regression.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v3 - name: dependancy run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ diff --git a/.github/workflows/meson_build.yml b/.github/workflows/meson_build.yml index d781680c55c..54635e71b85 100644 --- a/.github/workflows/meson_build.yml +++ b/.github/workflows/meson_build.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v3 - name: dependancy - linux run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ diff --git a/.github/workflows/oracle_pg_regression.yml b/.github/workflows/oracle_pg_regression.yml index 008dd645a4d..6fec885112b 100644 --- a/.github/workflows/oracle_pg_regression.yml +++ b/.github/workflows/oracle_pg_regression.yml @@ -11,14 +11,14 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-12] steps: - uses: actions/checkout@v3 - name: dependancy if: ${{ matrix.os == 'ubuntu-latest' }} run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ @@ -39,7 +39,7 @@ jobs: --with-ossp-uuid --with-libxml --with-libxslt --with-perl \ --with-icu - name: configure - macos - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-12' }} run: | export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" curl -L -o cpanm http://cpanmin.us && chmod +x cpanm && \ diff --git a/.github/workflows/oracle_regression.yml b/.github/workflows/oracle_regression.yml index d8813fd9084..d5093ab0b67 100644 --- a/.github/workflows/oracle_regression.yml +++ b/.github/workflows/oracle_regression.yml @@ -11,14 +11,14 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-12] steps: - uses: actions/checkout@v3 - name: dependancy if: ${{ matrix.os == 'ubuntu-latest' }} run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ @@ -39,7 +39,7 @@ jobs: --with-ossp-uuid --with-libxml --with-libxslt --with-perl \ --with-icu - name: configure - macos - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-12' }} run: | export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" curl -L -o cpanm http://cpanmin.us && chmod +x cpanm && \ diff --git a/.github/workflows/pg_regression.yml b/.github/workflows/pg_regression.yml index 32040513882..08a49eb4bad 100644 --- a/.github/workflows/pg_regression.yml +++ b/.github/workflows/pg_regression.yml @@ -11,14 +11,14 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-12] steps: - uses: actions/checkout@v3 - name: dependancy if: ${{ matrix.os == 'ubuntu-latest' }} run: | - sudo apt-get update + sudo apt-get update --allow-unauthenticated --allow-insecure-repositories sudo apt-get install -y build-essential git lcov bison flex \ libkrb5-dev libssl-dev libldap-dev libpam-dev python3-dev \ tcl-dev libperl-dev gettext libxml2-dev libxslt-dev \ @@ -39,7 +39,7 @@ jobs: --with-ossp-uuid --with-libxml --with-libxslt --with-perl \ --with-icu - name: configure - macos - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-12' }} run: | export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" curl -L -o cpanm http://cpanmin.us && chmod +x cpanm && \ diff --git a/contrib/ivorysql_ora/Makefile b/contrib/ivorysql_ora/Makefile index 0a8a22e0ecd..a452c079fd8 100644 --- a/contrib/ivorysql_ora/Makefile +++ b/contrib/ivorysql_ora/Makefile @@ -63,7 +63,8 @@ ORA_REGRESS = \ datatype_and_func_bugs \ ora_sysview \ ora_like_operator \ - ora_xml_functions + ora_xml_functions \ + ora_datetime_ignore_nls_mask SHLIB_LINK += -lxml2 diff --git a/contrib/ivorysql_ora/expected/ora_datetime.out b/contrib/ivorysql_ora/expected/ora_datetime.out index a21a9ad638d..250a6e76fa5 100644 --- a/contrib/ivorysql_ora/expected/ora_datetime.out +++ b/contrib/ivorysql_ora/expected/ora_datetime.out @@ -1236,3 +1236,20 @@ select 25::number <= to_char('1990-01-01'::oradate, 'yyyy'); t (1 row) +/* Begin - BUG#M0000247 */ +set client_min_messages = 'error'; +create table test_247(a date, b timestamp(7), c timestamp(7) with time zone, d timestamp(7) with local time zone); +set ivorysql.datetime_ignore_nls_mask = 15; +insert into test_247 values('2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567'); +SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; +select * from test_247; + a | b | c | d +---------------------+-------------------------------+-------------------------------+------------------------------- + 2023-10-27 10:54:55 | 2023-10-27 10:54:55.123457000 | 2023-10-27 10:54:55.123457000 | 2023-10-27 10:54:55.123457000 +(1 row) + +drop table test_247; +reset NLS_DATE_FORMAT; +reset ivorysql.datetime_ignore_nls_mask; +reset client_min_messages; +/* End - BUG#M0000247 */ diff --git a/contrib/ivorysql_ora/expected/ora_datetime_ignore_nls_mask.out b/contrib/ivorysql_ora/expected/ora_datetime_ignore_nls_mask.out new file mode 100644 index 00000000000..246ad943bd6 --- /dev/null +++ b/contrib/ivorysql_ora/expected/ora_datetime_ignore_nls_mask.out @@ -0,0 +1,344 @@ +-- +-- datetime_ignore_nls_mask +-- +-- build table and test 'datetime_ignore_nls_mask' parameter with value 0, do not ignore any types. +CREATE TABLE TEST_DATETIME_IGNORE_NLS_MASK(a date, b timestamp, c timestamptz, d timestamp with local time zone); +SET TIMEZONE TO 'Asia/Shanghai'; +SET ivorysql.datetime_ignore_nls_mask TO 0; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+----------------------------+-----------------------------------+---------------------------- + 2024-04-23 | 2024-04-23 15:16:11.000000 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15:16:11.000000 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 1, ignore date. +SET TIMEZONE TO 'Asia/Shanghai'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 1; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+----------------------------+-----------------------------------+---------------------------- + 2024-04-23 | 2024-04-23 15:16:11.000000 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15:16:11.000000 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 2, ignore timestamp. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 2; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+-----------------------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 3, ignore date and timestamp. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24:MI'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 3; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+------------------+-----------------------------------+------------------ + 2024-04-23 | 2024-04-23 15:16 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15:16 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 4, ignore timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ..._MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 4; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+----------------------------+---------------------+---------------------------- + 2024-04-23 | 2024-04-23 15:16:11.000000 | 2024-04-23 14:16:11 | 2024-04-23 15:16:11.000000 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 5, ignore date and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ..._MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 5; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+----------------------------+---------------------+---------------------------- + 2024-04-23 | 2024-04-23 15:16:11.000000 | 2024-04-23 14:16:11 | 2024-04-23 15:16:11.000000 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 6, ignore timestamp and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 6; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 7, ignore date, timestamp and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 7; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 8, ignore timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 8; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+-----------------------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 9, ignore date and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 9; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+-----------------------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 10, ignore timestamp and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 10; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+-----------------------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 11, ignore date, timestamp and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 11; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+-----------------------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11.000000 +08:00 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 12, ignore timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...4-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 12; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 13, ignore date, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...4-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 13; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 14, ignore timestamp, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...4-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 14; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 15, date, timestamp, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...EST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...RE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-2... + ^ +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); +ERROR: datetime format picture ends before converting entire input string +LINE 1: ...4-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-2... + ^ +SET ivorysql.datetime_ignore_nls_mask TO 15; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; + a | b | c | d +------------+---------------+---------------------+--------------- + 2024-04-23 | 2024-04-23 15 | 2024-04-23 14:16:11 | 2024-04-23 15 +(1 row) + +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; diff --git a/contrib/ivorysql_ora/sql/ora_datetime.sql b/contrib/ivorysql_ora/sql/ora_datetime.sql index 138ef43cb09..e7c1567b946 100644 --- a/contrib/ivorysql_ora/sql/ora_datetime.sql +++ b/contrib/ivorysql_ora/sql/ora_datetime.sql @@ -597,3 +597,17 @@ SELECT 123.456 * interval'365 11:11:11' day(3) to second; -- The operator "<=" supports a comparison between the "number" type and the "varchar2" type. SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; select 25::number <= to_char('1990-01-01'::oradate, 'yyyy'); + +/* Begin - BUG#M0000247 */ +set client_min_messages = 'error'; +create table test_247(a date, b timestamp(7), c timestamp(7) with time zone, d timestamp(7) with local time zone); +set ivorysql.datetime_ignore_nls_mask = 15; +insert into test_247 values('2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567', '2023-10-27 10:54:55.1234567'); +SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; +select * from test_247; + +drop table test_247; +reset NLS_DATE_FORMAT; +reset ivorysql.datetime_ignore_nls_mask; +reset client_min_messages; +/* End - BUG#M0000247 */ \ No newline at end of file diff --git a/contrib/ivorysql_ora/sql/ora_datetime_ignore_nls_mask.sql b/contrib/ivorysql_ora/sql/ora_datetime_ignore_nls_mask.sql new file mode 100644 index 00000000000..9e599cd569f --- /dev/null +++ b/contrib/ivorysql_ora/sql/ora_datetime_ignore_nls_mask.sql @@ -0,0 +1,198 @@ +-- +-- datetime_ignore_nls_mask +-- + +-- build table and test 'datetime_ignore_nls_mask' parameter with value 0, do not ignore any types. +CREATE TABLE TEST_DATETIME_IGNORE_NLS_MASK(a date, b timestamp, c timestamptz, d timestamp with local time zone); +SET TIMEZONE TO 'Asia/Shanghai'; +SET ivorysql.datetime_ignore_nls_mask TO 0; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 1, ignore date. +SET TIMEZONE TO 'Asia/Shanghai'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 1; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 2, ignore timestamp. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15'); + +SET ivorysql.datetime_ignore_nls_mask TO 2; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 3, ignore date and timestamp. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24:MI'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); + +SET ivorysql.datetime_ignore_nls_mask TO 3; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11 +08:00', '2024-04-23 15:16:11 +09', '2024-04-23 15:16'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 4, ignore timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 4; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 5, ignore date and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 5; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 6, ignore timestamp and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); + +SET ivorysql.datetime_ignore_nls_mask TO 6; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 7, ignore date, timestamp and timestamptz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); + +SET ivorysql.datetime_ignore_nls_mask TO 7; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 8, ignore timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 8; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 9, ignore date and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 9; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 10, ignore timestamp and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 10; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 11, ignore date, timestamp and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 11; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 12, ignore timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 12; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 13, ignore date, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 13; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 14, ignore timestamp, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 14; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; +-- test 'datetime_ignore_nls_mask' parameter with value 15, date, timestamp, timestamptz and timestampltz. +SET TIMEZONE TO 'Asia/Shanghai'; +SET nls_timestamp_format = 'YYYY-MM-DD HH24'; +SET nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS'; +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23', '2024-04-23 15', '2024-04-23 15:16:11', '2024-04-23 15:16:11'); + +SET ivorysql.datetime_ignore_nls_mask TO 15; + +INSERT INTO TEST_DATETIME_IGNORE_NLS_MASK VALUES('2024-04-23 15:16:11', '2024-04-23 15:16:11', '2024-04-23 15:16:11 +09:00', '2024-04-23 15:16:11'); +SELECT * FROM TEST_DATETIME_IGNORE_NLS_MASK; +DELETE FROM TEST_DATETIME_IGNORE_NLS_MASK; +RESET ALL; \ No newline at end of file diff --git a/contrib/ivorysql_ora/src/datatype/oradate.c b/contrib/ivorysql_ora/src/datatype/oradate.c index 0b5315e6a7d..4bddf9d6626 100644 --- a/contrib/ivorysql_ora/src/datatype/oradate.c +++ b/contrib/ivorysql_ora/src/datatype/oradate.c @@ -38,6 +38,7 @@ #include "utils/timestamp.h" #include "utils/date.h" +#include "../include/common_datatypes.h" /* BUG#M0000247 */ PG_FUNCTION_INFO_V1(oradate_in); PG_FUNCTION_INFO_V1(oradate_out); @@ -143,6 +144,68 @@ timestamp2timestamptz(Timestamp timestamp) return result; } +/* Begin - BUG#M0000247 */ +/* + * Same as timestamp_in(), In oracle mode, oradate type input is + * not affected by the nls parameter, and you can also choose to + * execute pg's input parsing logic. + */ +Timestamp +pg_oradate_in(char *str, int32 typmod) +{ + Timestamp result; + fsec_t fsec; + struct pg_tm tt, + *tm = &tt; + int tz; + int dtype; + int nf; + int dterr; + char *field[MAXDATEFIELDS]; + int ftype[MAXDATEFIELDS]; + char workbuf[MAXDATELEN + MAXDATEFIELDS]; + DateTimeErrorExtra extra; + + dterr = ParseDateTime(str, workbuf, sizeof(workbuf), + field, ftype, MAXDATEFIELDS, &nf); + if (dterr == 0) + dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz, &extra); + if (dterr != 0) + DateTimeParseError(dterr, &extra, str, "date", NULL); + + switch (dtype) + { + case DTK_DATE: + if (tm2timestamp(tm, fsec, NULL, &result) != 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("date out of range: \"%s\"", str))); + break; + + case DTK_EPOCH: + result = SetEpochTimestamp(); + break; + + case DTK_LATE: + TIMESTAMP_NOEND(result); + break; + + case DTK_EARLY: + TIMESTAMP_NOBEGIN(result); + break; + + default: + elog(ERROR, "unexpected dtype %d while parsing date \"%s\"", + dtype, str); + TIMESTAMP_NOEND(result); + } + + OraAdjustTimestampForTypmod(&result, typmod); + + return result; +} +/* End - BUG#M0000247 */ + /***************************************************************************** * USER I/O ROUTINES * *****************************************************************************/ @@ -161,8 +224,10 @@ oradate_in(PG_FUNCTION_ARGS) if (strcmp(nls_date_format, "pg") == 0 || DATETIME_IGNORE_NLS(datetime_ignore_nls_mask, ORADATE_MASK)) { - return DirectFunctionCall1(date_timestamp, - DirectFunctionCall1(date_in, CStringGetDatum(str))); + /* Begin - BUG#M0000247 */ + result = pg_oradate_in(str, 0); + PG_RETURN_TIMESTAMP(result); + /* End - BUG#M0000247 */ } else { diff --git a/contrib/ivorysql_ora/src/datatype/oratimestamp.c b/contrib/ivorysql_ora/src/datatype/oratimestamp.c index 4fbbd60dd54..291631b9e5d 100644 --- a/contrib/ivorysql_ora/src/datatype/oratimestamp.c +++ b/contrib/ivorysql_ora/src/datatype/oratimestamp.c @@ -173,6 +173,68 @@ OraAdjustTimestampForTypmod(Timestamp *time, int32 typmod) } } +/* Begin - BUG#M0000247 */ +/* + * Same as timestamp_in(), In oracle mode, oratimestamp input is + * not affected by the nls parameter, and you can also choose to + * execute pg's input parsing logic. + */ +Timestamp +pg_oratimestamp_in(char *str, int32 typmod) +{ + Timestamp result; + fsec_t fsec; + struct pg_tm tt, + *tm = &tt; + int tz; + int dtype; + int nf; + int dterr; + char *field[MAXDATEFIELDS]; + int ftype[MAXDATEFIELDS]; + char workbuf[MAXDATELEN + MAXDATEFIELDS]; + DateTimeErrorExtra extra; + + dterr = ParseDateTime(str, workbuf, sizeof(workbuf), + field, ftype, MAXDATEFIELDS, &nf); + if (dterr == 0) + dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz, &extra); + if (dterr != 0) + DateTimeParseError(dterr, &extra, str, "timestamp", NULL); + + switch (dtype) + { + case DTK_DATE: + if (tm2timestamp(tm, fsec, NULL, &result) != 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range: \"%s\"", str))); + break; + + case DTK_EPOCH: + result = SetEpochTimestamp(); + break; + + case DTK_LATE: + TIMESTAMP_NOEND(result); + break; + + case DTK_EARLY: + TIMESTAMP_NOBEGIN(result); + break; + + default: + elog(ERROR, "unexpected dtype %d while parsing timestamp \"%s\"", + dtype, str); + TIMESTAMP_NOEND(result); + } + + OraAdjustTimestampForTypmod(&result, typmod); + + return result; +} +/* End - BUG#M0000247 */ + /* common code for timestamptypmodin and timestamptztypmodin */ static int32 anytimestamp_typmodin(bool istz, ArrayType *ta) @@ -282,10 +344,10 @@ oratimestamp_in(PG_FUNCTION_ARGS) if (strcmp(nls_timestamp_format, "pg") == 0 || DATETIME_IGNORE_NLS(datetime_ignore_nls_mask, ORATIMESTAMP_MASK)) { - return DirectFunctionCall3(timestamp_in, - CStringGetDatum(str), - ObjectIdGetDatum(InvalidOid), - Int32GetDatum(typmod)); + /* Begin - BUG#M0000247 */ + result = pg_oratimestamp_in(str, typmod); + PG_RETURN_TIMESTAMP(result); + /* End - BUG#M0000247 */ } else { diff --git a/contrib/ivorysql_ora/src/datatype/oratimestampltz.c b/contrib/ivorysql_ora/src/datatype/oratimestampltz.c index 821430ec0ed..dbdb81e7e37 100644 --- a/contrib/ivorysql_ora/src/datatype/oratimestampltz.c +++ b/contrib/ivorysql_ora/src/datatype/oratimestampltz.c @@ -195,9 +195,12 @@ oratimestampltz_in(PG_FUNCTION_ARGS) if (strcmp(nls_timestamp_format, "pg") == 0 || DATETIME_IGNORE_NLS(datetime_ignore_nls_mask, ORATIMESTAMPLTZ_MASK)) { - Datum datum; - datum = DirectFunctionCall3(timestamp_in, CStringGetDatum(str), ObjectIdGetDatum(InvalidOid), Int32GetDatum(typmod)); - PG_RETURN_TIMESTAMPTZ(timestamp2timestamptz(DatumGetTimestamp(datum))); + /* Begin - BUG#M0000247 */ + Timestamp res; + + res = pg_oratimestamp_in(str, typmod); + PG_RETURN_TIMESTAMPTZ(timestamp2timestamptz(res)); + /* End - BUG#M0000247 */ } else { diff --git a/contrib/ivorysql_ora/src/datatype/oratimestamptz.c b/contrib/ivorysql_ora/src/datatype/oratimestamptz.c index 45c8d852b97..8d5c30450cf 100644 --- a/contrib/ivorysql_ora/src/datatype/oratimestamptz.c +++ b/contrib/ivorysql_ora/src/datatype/oratimestamptz.c @@ -170,6 +170,68 @@ timestamp2timestamptz(Timestamp timestamp) return result; } +/* Begin - BUG#M0000247 */ +/* + * Same as timestamptz_in(), In oracle mode, oratimestamptz input is + * not affected by the nls parameter, and you can also choose to + * execute pg's input parsing logic. + */ +TimestampTz +pg_oratimestamptz_in(char *str, int32 typmod) +{ + TimestampTz result; + fsec_t fsec; + struct pg_tm tt, + *tm = &tt; + int tz; + int dtype; + int nf; + int dterr; + char *field[MAXDATEFIELDS]; + int ftype[MAXDATEFIELDS]; + char workbuf[MAXDATELEN + MAXDATEFIELDS]; + DateTimeErrorExtra extra; + + dterr = ParseDateTime(str, workbuf, sizeof(workbuf), + field, ftype, MAXDATEFIELDS, &nf); + if (dterr == 0) + dterr = DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz, &extra); + if (dterr != 0) + DateTimeParseError(dterr, &extra, str, "timestamp with time zone", NULL); + + switch (dtype) + { + case DTK_DATE: + if (tm2timestamp(tm, fsec, &tz, &result) != 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range: \"%s\"", str))); + break; + + case DTK_EPOCH: + result = SetEpochTimestamp(); + break; + + case DTK_LATE: + TIMESTAMP_NOEND(result); + break; + + case DTK_EARLY: + TIMESTAMP_NOBEGIN(result); + break; + + default: + elog(ERROR, "unexpected dtype %d while parsing timestamptz \"%s\"", + dtype, str); + TIMESTAMP_NOEND(result); + } + + OraAdjustTimestampForTypmod(&result, typmod); + + return result; +} +/* Begin - BUG#M0000247 */ + /***************************************************************************** * USER I/O ROUTINES * *****************************************************************************/ @@ -190,10 +252,12 @@ oratimestamptz_in(PG_FUNCTION_ARGS) if (strcmp(nls_timestamp_tz_format, "pg") == 0 || DATETIME_IGNORE_NLS(datetime_ignore_nls_mask, ORATIMESTAMPTZ_MASK)) { - return DirectFunctionCall3(timestamptz_in, - CStringGetDatum(str), - ObjectIdGetDatum(InvalidOid), - Int32GetDatum(typmod)); + /* Begin - BUG#M0000247 */ + TimestampTz result; + + result = pg_oratimestamptz_in(str, typmod); + PG_RETURN_TIMESTAMPTZ(result); + /* End - BUG#M0000247 */ } else { diff --git a/contrib/ivorysql_ora/src/include/common_datatypes.h b/contrib/ivorysql_ora/src/include/common_datatypes.h index 72cf0f07f1b..77419a3c46e 100644 --- a/contrib/ivorysql_ora/src/include/common_datatypes.h +++ b/contrib/ivorysql_ora/src/include/common_datatypes.h @@ -54,6 +54,13 @@ extern PGDLLEXPORT Datum oratimestamptz_cmp(PG_FUNCTION_ARGS); /* oratimestampltz.c */ extern PGDLLEXPORT Datum oratimestampltz_cmp(PG_FUNCTION_ARGS); +extern Timestamp pg_oratimestamp_in(char *str, int32 typmod); /* BUG#M0000247 */ + +/* oradate.c */ +extern Timestamp pg_oradate_in(char *str, int32 typmod); /* BUG#M0000247 */ + +/* oratimestamptz.c */ +extern TimestampTz pg_oratimestamptz_in(char *str, int32 typmod); /* BUG#M0000247 */ /* dsinterval.c */ extern Datum dsinterval_out(PG_FUNCTION_ARGS);