node-oracledb/test/dataTypeAssist.js

1052 lines
32 KiB
JavaScript

/* Copyright (c) 2015, 2023, Oracle and/or its affiliates. */
/******************************************************************************
*
* This software is dual-licensed to you under the Universal Permissive License
* (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
* 2.0 as shown at https://www.apache.org/licenses/LICENSE-2.0. You may choose
* either license.
*
* If you elect to accept the software under the Apache License, Version 2.0,
* the following applies:
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME
* 21. datatypeAssist.js
*
* DESCRIPTION
* Helper functions and data for Oracle Data Type support tests.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const assert = require('assert');
const assist = exports;
/* Mapping between table names and data types */
assist.allDataTypeNames =
{
"nodb_char": "CHAR(2000)",
"nodb_nchar": "NCHAR(1000)",
"nodb_varchar2": "VARCHAR2(4000)",
"nodb_nvarchar2": "NVARCHAR2(2000)",
"nodb_number": "NUMBER",
"nodb_number2": "NUMBER(15, 5)",
"nodb_float": "FLOAT",
"nodb_float2": "FLOAT(90)",
"nodb_binary_float": "BINARY_FLOAT",
"nodb_double": "BINARY_DOUBLE",
"nodb_date": "DATE",
"nodb_timestamp1": "TIMESTAMP",
"nodb_timestamp2": "TIMESTAMP(5)",
"nodb_timestamp3": "TIMESTAMP WITH TIME ZONE",
"nodb_timestamp4": "TIMESTAMP (4) WITH TIME ZONE",
"nodb_timestamp5": "TIMESTAMP WITH LOCAL TIME ZONE",
"nodb_timestamp6": "TIMESTAMP (9) WITH LOCAL TIME ZONE",
"nodb_rowid": "ROWID",
"nodb_urowid": "UROWID",
"nodb_nclob": "NCLOB",
"nodb_myclobs": "CLOB",
"nodb_myblobs": "BLOB",
"nodb_raw": "RAW(2000)",
"nodb_long": "LONG",
"nodb_longraw": "LONG RAW",
"nodb_json": "JSON"
};
assist.allDataTypes =
{
"nodb_char": oracledb.DB_TYPE_CHAR,
"nodb_nchar": oracledb.DB_TYPE_NCHAR,
"nodb_varchar2": oracledb.DB_TYPE_VARCHAR,
"nodb_nvarchar2": oracledb.DB_TYPE_NVARCHAR,
"nodb_number": oracledb.DB_TYPE_NUMBER,
"nodb_number2": oracledb.DB_TYPE_NUMBER,
"nodb_float": oracledb.DB_TYPE_NUMBER,
"nodb_float2": oracledb.DB_TYPE_NUMBER,
"nodb_binary_float": oracledb.DB_TYPE_BINARY_FLOAT,
"nodb_double": oracledb.DB_TYPE_BINARY_DOUBLE,
"nodb_date": oracledb.DB_TYPE_DATE,
"nodb_timestamp1": oracledb.DB_TYPE_TIMESTAMP,
"nodb_timestamp2": oracledb.DB_TYPE_TIMESTAMP,
"nodb_timestamp3": oracledb.DB_TYPE_TIMESTAMP_TZ,
"nodb_timestamp4": oracledb.DB_TYPE_TIMESTAMP_TZ,
"nodb_timestamp5": oracledb.DB_TYPE_TIMESTAMP_LTZ,
"nodb_timestamp6": oracledb.DB_TYPE_TIMESTAMP_LTZ,
"nodb_rowid": oracledb.DB_TYPE_VARCHAR,
"nodb_urowid": oracledb.DB_TYPE_VARCHAR,
"nodb_nclob": oracledb.DB_TYPE_NVARCHAR,
"nodb_myclobs": oracledb.DB_TYPE_VARCHAR,
"nodb_myblobs": oracledb.DB_TYPE_RAW,
"nodb_raw": oracledb.DB_TYPE_RAW,
"nodb_long": oracledb.DB_TYPE_VARCHAR,
"nodb_longraw": oracledb.DB_TYPE_RAW,
"nodb_json": oracledb.DB_TYPE_JSON
};
assist.data = {
specialChars: [
'"',
' ',
'\'',
'%',
'&',
'^',
'~',
'`',
'*',
'!',
'@',
'#',
'$',
'(',
')',
'[',
']',
'{',
' }',
'_',
'-',
'=',
'+',
',',
'.',
'/',
'<',
'>',
'?',
';',
':',
'\\',
'|'
],
strings: [
null,
"true",
"false",
"1",
"0",
"8",
"http://www.ORACLE.com",
"https://github.com/oracle/node-oracledb/blob/main/doc/api.md",
"1234",
"9876.54321",
"1991-06-01",
"07:56:34",
"2009-07-09 02:00:00",
"1999-09-04 04:04:04 PST",
"06 05:04:03.0",
"7-9",
"AAABBBCCCAAABBBCC1",
"<t>this is xml</t>",
"01-JAN-99 11.01.11.110000000 AM",
"03-MAY-03 12.31.56.780000000 PM US/PACIFIC",
"30-09-2005 17:27:05",
"03-MAY-13 11.01.11",
"03-MAY-13"
],
alphabet: [
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y',
'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x',
'y', 'z'
],
numbers: [
1,
0,
8,
-8,
1234,
-1234,
9876.54321,
-9876.54321,
0.01234,
-0.01234,
0.00000123,
-0.00000123,
1234567890.0123,
-1234567890.0123
],
numbersForBinaryFloat:
[
1,
0,
8,
-8,
1234,
-1234,
234567,
-234567,
12345678,
-12345678
],
numbersForBinaryDouble:
[
2345.67,
9876.54321,
0.01234,
1234567890.0123
],
dates: [
new Date(-100000000),
new Date(0),
new Date(10000000000),
new Date(100000000000),
new Date(1995, 11, 17),
new Date(-1995, 11, 17), // Year in BC
new Date('1995-12-17T03:24:00'),
new Date('2015-07-23 21:00:00'),
new Date('2015-07-23 22:00:00'),
new Date('2015-07-23 23:00:00'),
new Date('2015-07-24 00:00:00'),
new Date('100-07-24 00:00:00'),
new Date(-100, 11, 17), // Year in BC
new Date(2003, 9, 23, 11, 50, 30, 123)
]
};
assist.DATE_STRINGS =
[
"TO_DATE('2005-01-06','YYYY-DD-MM') ",
"TO_DATE('2005-09-01', 'YYYY-MM-DD')",
"TO_DATE('2005-08-05', 'YYYY-MM-DD')",
"TO_DATE('07-05-1998', 'MM-DD-YYYY')",
"TO_DATE('07-05-1998', 'DD-MM-YYYY')",
"TO_TIMESTAMP('1999-12-01 11:10:01.00123', 'YYYY-MM-DD HH:MI:SS.FF')"
];
// for TIMESTAMP WITHOUT TIME ZONE
assist.TIMESTAMP_STRINGS =
[
"TO_TIMESTAMP('2005-01-06', 'YYYY-DD-MM') ",
"TO_TIMESTAMP('2005-09-01', 'YYYY-MM-DD')",
"TO_TIMESTAMP('2005-08-05', 'YYYY-MM-DD')",
"TO_TIMESTAMP('07-05-1998', 'MM-DD-YYYY')",
"TO_TIMESTAMP('07-05-1998', 'DD-MM-YYYY')",
"TO_TIMESTAMP('2005-09-01 07:05:19', 'YYYY-MM-DD HH:MI:SS')",
"TO_TIMESTAMP('1999-12-01 11:00:00.1', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.12', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.123', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:01:10.0123', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.1234', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.00123', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.12345', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.123456', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.1234567', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:02:20.0000123', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.12345678', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('1999-12-01 11:00:00.123456789', 'YYYY-MM-DD HH:MI:SS.FF')",
"TO_TIMESTAMP('10-Sep-02 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF')"
];
// for TIMESTAMP WITH TIME ZONE
assist.TIMESTAMP_TZ_STRINGS_1 =
[
"TO_TIMESTAMP_TZ('2005-01-06 11:00:00.1 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('2005-09-01 11:00:00.1 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('2005-08-05 11:00:00.1 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('07-05-1998 11:00:00.1 -8:00', 'MM-DD-YYYY HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('07-05-1998 11:00:00.123 -8:00', 'DD-MM-YYYY HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.0123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1234 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.00123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12345 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123456 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1234567 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:20:02.0000123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12345678 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123456189 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM')",
"TO_TIMESTAMP_TZ('10-Sep-02 14:10:10.123000 -8:00', 'DD-Mon-RR HH24:MI:SS.FF TZH:TZM')"
];
// for TIMESTAMP WITH TIME ZONE
assist.TIMESTAMP_TZ_STRINGS_2 =
[
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.0123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1234 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.00123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12345 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123456 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.1234567 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:20:02.0000123 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.12345678 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00.123456789 -8:00', 'YYYY-MM-DD HH:MI:SS.FF TZH:TZM')",
"TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM')"
];
// for INTERVAL MONTH TO YEAR
assist.INTERVAL_MONTH_TO_YEAR =
[
"TO_YMINTERVAL('01-02')",
"TO_YMINTERVAL('P1Y2M')",
"TO_YMINTERVAL('1x-02' DEFAULT '00-00' ON CONVERSION ERROR)",
"TO_YMINTERVAL ('22-02')",
"TO_YMINTERVAL ('33-03')"
];
// for INTERVAL DAY TO SECOND
assist.INTERVAL_DAY_TO_SECOND =
[
"TO_DSINTERVAL('20 00:00:20')",
"TO_DSINTERVAL('10 00:00:10')",
"TO_DSINTERVAL('1o 1:02:10' DEFAULT '10 8:00:00' ON CONVERSION ERROR)",
"TO_DSINTERVAL ('11 00:00:11')",
"TO_DSINTERVAL ('12 00:00:22')"
];
// for RAW
assist.RAW =
[
"UTL_RAW.cast_to_raw('0x0002')",
"UTL_RAW.cast_to_raw('0x48')",
"UTL_RAW.cast_to_raw('0x65')",
"UTL_RAW.cast_to_raw('0x6c')",
"UTL_RAW.cast_to_raw('0x6f')",
"UTL_RAW.cast_to_raw('0x2c')",
"UTL_RAW.cast_to_raw('0x20')",
"UTL_RAW.cast_to_raw('0x4f')",
"UTL_RAW.cast_to_raw('0x72')",
"UTL_RAW.cast_to_raw('0x21')"
];
// content serves as reference logs
assist.content =
{
dates:
[
'01-06-2005',
'01-09-2005',
'05-08-2005',
'05-07-1998',
'07-05-1998',
'01-12-1999'
],
timestamps1:
[
'01-06-2005 00:00:00.000000',
'01-09-2005 00:00:00.000000',
'05-08-2005 00:00:00.000000',
'05-07-1998 00:00:00.000000',
'07-05-1998 00:00:00.000000',
'01-09-2005 07:05:19.000000',
'01-12-1999 11:00:00.100000',
'01-12-1999 11:00:00.120000',
'01-12-1999 11:00:00.123000',
'01-12-1999 11:01:10.012300',
'01-12-1999 11:00:00.123400',
'01-12-1999 11:00:00.001230',
'01-12-1999 11:00:00.123450',
'01-12-1999 11:00:00.123456',
'01-12-1999 11:00:00.123457',
'01-12-1999 11:02:20.000012',
'01-12-1999 11:00:00.123457',
'01-12-1999 11:00:00.123457',
'10-09-2002 14:10:10.123000'
],
timestamps2:
[
'01-06-2005 00:00:00.00000',
'01-09-2005 00:00:00.00000',
'05-08-2005 00:00:00.00000',
'05-07-1998 00:00:00.00000',
'07-05-1998 00:00:00.00000',
'01-09-2005 07:05:19.00000',
'01-12-1999 11:00:00.10000',
'01-12-1999 11:00:00.12000',
'01-12-1999 11:00:00.12300',
'01-12-1999 11:01:10.01230',
'01-12-1999 11:00:00.12340',
'01-12-1999 11:00:00.00123',
'01-12-1999 11:00:00.12345',
'01-12-1999 11:00:00.12346',
'01-12-1999 11:00:00.12346',
'01-12-1999 11:02:20.00001',
'01-12-1999 11:00:00.12346',
'01-12-1999 11:00:00.12346',
'10-09-2002 14:10:10.12300'
],
timestamps3:
[
'06-01-2005 11:00:00.100000 -08:00',
'01-09-2005 11:00:00.100000 -08:00',
'05-08-2005 11:00:00.100000 -08:00',
'05-07-1998 11:00:00.100000 -08:00',
'07-05-1998 11:00:00.123000 -08:00',
'01-12-1999 11:00:00.100000 -08:00',
'01-12-1999 11:00:00.120000 -08:00',
'01-12-1999 11:00:00.123000 -08:00',
'01-12-1999 11:00:00.012300 -08:00',
'01-12-1999 11:00:00.123400 -08:00',
'01-12-1999 11:00:00.001230 -08:00',
'01-12-1999 11:00:00.123450 -08:00',
'01-12-1999 11:00:00.123456 -08:00',
'01-12-1999 11:00:00.123457 -08:00',
'01-12-1999 11:20:02.000012 -08:00',
'01-12-1999 11:00:00.123457 -08:00',
'01-12-1999 11:00:00.123456 -08:00',
'01-12-1999 11:00:00.000000 -08:00',
'10-09-2002 14:10:10.123000 -08:00'
],
timestamps4:
[
'06-01-2005 11:00:00.1000 -08:00',
'01-09-2005 11:00:00.1000 -08:00',
'05-08-2005 11:00:00.1000 -08:00',
'05-07-1998 11:00:00.1000 -08:00',
'07-05-1998 11:00:00.1230 -08:00',
'01-12-1999 11:00:00.1000 -08:00',
'01-12-1999 11:00:00.1200 -08:00',
'01-12-1999 11:00:00.1230 -08:00',
'01-12-1999 11:00:00.0123 -08:00',
'01-12-1999 11:00:00.1234 -08:00',
'01-12-1999 11:00:00.0012 -08:00',
'01-12-1999 11:00:00.1235 -08:00',
'01-12-1999 11:00:00.1235 -08:00',
'01-12-1999 11:00:00.1235 -08:00',
'01-12-1999 11:20:02.0000 -08:00',
'01-12-1999 11:00:00.1235 -08:00',
'01-12-1999 11:00:00.1235 -08:00',
'01-12-1999 11:00:00.0000 -08:00',
'10-09-2002 14:10:10.1230 -08:00'
],
timestamps5:
[
'01-12-1999 11:00:00.100000 -08:00',
'01-12-1999 11:00:00.120000 -08:00',
'01-12-1999 11:00:00.123000 -08:00',
'01-12-1999 11:00:00.012300 -08:00',
'01-12-1999 11:00:00.123400 -08:00',
'01-12-1999 11:00:00.001230 -08:00',
'01-12-1999 11:00:00.123450 -08:00',
'01-12-1999 11:00:00.123456 -08:00',
'01-12-1999 11:00:00.123457 -08:00',
'01-12-1999 11:20:02.000012 -08:00',
'01-12-1999 11:00:00.123457 -08:00',
'01-12-1999 11:00:00.123457 -08:00',
'01-12-1999 11:00:00.000000 -08:00'
],
timestamps6:
[
'01-12-1999 11:00:00.100000000 -08:00',
'01-12-1999 11:00:00.120000000 -08:00',
'01-12-1999 11:00:00.123000000 -08:00',
'01-12-1999 11:00:00.012300000 -08:00',
'01-12-1999 11:00:00.123400000 -08:00',
'01-12-1999 11:00:00.001230000 -08:00',
'01-12-1999 11:00:00.123450000 -08:00',
'01-12-1999 11:00:00.123456000 -08:00',
'01-12-1999 11:00:00.123456700 -08:00',
'01-12-1999 11:20:02.000012300 -08:00',
'01-12-1999 11:00:00.123456780 -08:00',
'01-12-1999 11:00:00.123456789 -08:00',
'01-12-1999 11:00:00.000000000 -08:00'
],
timestamp_1_1:
[
[ '2005-06-01 00:00:00.000000' ],
[ '2005-09-01 00:00:00.000000' ],
[ '2005-08-05 00:00:00.000000' ],
[ '1998-07-05 00:00:00.000000' ],
[ '1998-05-07 00:00:00.000000' ],
[ '2005-09-01 07:05:19.000000' ],
[ '1999-12-01 11:00:00.100000' ],
[ '1999-12-01 11:00:00.120000' ],
[ '1999-12-01 11:00:00.123000' ],
[ '1999-12-01 11:01:10.012300' ],
[ '1999-12-01 11:00:00.123400' ],
[ '1999-12-01 11:00:00.001230' ],
[ '1999-12-01 11:00:00.123450' ],
[ '1999-12-01 11:00:00.123456' ],
[ '1999-12-01 11:00:00.123457' ],
[ '1999-12-01 11:02:20.000012' ],
[ '1999-12-01 11:00:00.123457' ],
[ '1999-12-01 11:00:00.123457' ],
[ '2002-09-10 14:10:10.123000' ]
],
timestamp_1_2:
[
{ CONTENT: '2005-06-01 00:00:00.000000' },
{ CONTENT: '2005-09-01 00:00:00.000000' },
{ CONTENT: '2005-08-05 00:00:00.000000' },
{ CONTENT: '1998-07-05 00:00:00.000000' },
{ CONTENT: '1998-05-07 00:00:00.000000' },
{ CONTENT: '2005-09-01 07:05:19.000000' },
{ CONTENT: '1999-12-01 11:00:00.100000' },
{ CONTENT: '1999-12-01 11:00:00.120000' },
{ CONTENT: '1999-12-01 11:00:00.123000' },
{ CONTENT: '1999-12-01 11:01:10.012300' },
{ CONTENT: '1999-12-01 11:00:00.123400' },
{ CONTENT: '1999-12-01 11:00:00.001230' },
{ CONTENT: '1999-12-01 11:00:00.123450' },
{ CONTENT: '1999-12-01 11:00:00.123456' },
{ CONTENT: '1999-12-01 11:00:00.123457' },
{ CONTENT: '1999-12-01 11:02:20.000012' },
{ CONTENT: '1999-12-01 11:00:00.123457' },
{ CONTENT: '1999-12-01 11:00:00.123457' },
{ CONTENT: '2002-09-10 14:10:10.123000' }
],
timestamp_3_1:
[
[ '2005-01-06 11:00:00.100000' ],
[ '2005-09-01 11:00:00.100000' ],
[ '2005-08-05 11:00:00.100000' ],
[ '1998-07-05 11:00:00.100000' ],
[ '1998-05-07 11:00:00.123000' ],
[ '1999-12-01 11:00:00.100000' ],
[ '1999-12-01 11:00:00.120000' ],
[ '1999-12-01 11:00:00.123000' ],
[ '1999-12-01 11:00:00.012300' ],
[ '1999-12-01 11:00:00.123400' ],
[ '1999-12-01 11:00:00.001230' ],
[ '1999-12-01 11:00:00.123450' ],
[ '1999-12-01 11:00:00.123456' ],
[ '1999-12-01 11:00:00.123457' ],
[ '1999-12-01 11:20:02.000012' ],
[ '1999-12-01 11:00:00.123457' ],
[ '1999-12-01 11:00:00.123456' ],
[ '1999-12-01 11:00:00.000000' ],
[ '2002-09-10 14:10:10.123000' ]
],
timestamp_3_2:
[
{ CONTENT: '2005-01-06 11:00:00.100000' },
{ CONTENT: '2005-09-01 11:00:00.100000' },
{ CONTENT: '2005-08-05 11:00:00.100000' },
{ CONTENT: '1998-07-05 11:00:00.100000' },
{ CONTENT: '1998-05-07 11:00:00.123000' },
{ CONTENT: '1999-12-01 11:00:00.100000' },
{ CONTENT: '1999-12-01 11:00:00.120000' },
{ CONTENT: '1999-12-01 11:00:00.123000' },
{ CONTENT: '1999-12-01 11:00:00.012300' },
{ CONTENT: '1999-12-01 11:00:00.123400' },
{ CONTENT: '1999-12-01 11:00:00.001230' },
{ CONTENT: '1999-12-01 11:00:00.123450' },
{ CONTENT: '1999-12-01 11:00:00.123456' },
{ CONTENT: '1999-12-01 11:00:00.123457' },
{ CONTENT: '1999-12-01 11:20:02.000012' },
{ CONTENT: '1999-12-01 11:00:00.123457' },
{ CONTENT: '1999-12-01 11:00:00.123456' },
{ CONTENT: '1999-12-01 11:00:00.000000' },
{ CONTENT: '2002-09-10 14:10:10.123000' }
],
timestamp_3_3:
[
[ '06-JAN-2005 11:00:00:100000' ],
[ '01-SEP-2005 11:00:00:100000' ],
[ '05-AUG-2005 11:00:00:100000' ],
[ '05-JUL-1998 11:00:00:100000' ],
[ '07-MAY-1998 11:00:00:123000' ],
[ '01-DEC-1999 11:00:00:100000' ],
[ '01-DEC-1999 11:00:00:120000' ],
[ '01-DEC-1999 11:00:00:123000' ],
[ '01-DEC-1999 11:00:00:012300' ],
[ '01-DEC-1999 11:00:00:123400' ],
[ '01-DEC-1999 11:00:00:001230' ],
[ '01-DEC-1999 11:00:00:123450' ],
[ '01-DEC-1999 11:00:00:123456' ],
[ '01-DEC-1999 11:00:00:123457' ],
[ '01-DEC-1999 11:20:02:000012' ],
[ '01-DEC-1999 11:00:00:123457' ],
[ '01-DEC-1999 11:00:00:123456' ],
[ '01-DEC-1999 11:00:00:000000' ],
[ '10-SEP-2002 14:10:10:123000' ]
]
};
assist.jsonValues = [
'{ "key1" : 1 }',
'{ "key2" : -3.1415 }',
'{ "key3" : false }',
'{ "key4" : null }',
'{ "key5" : "2018/11/01 18:30:00" }',
'{ "key6" : [1,2,3,99] }',
'{ "key7" : ["json array1", "json array2"], "key8" : [true, false] }',
'{ "key9" : "#$%^&*()@!~`-+=" }',
'{ "key10" : "_:;?><,.|/" }',
'{ "key11" : "Math.pow(2, 53) -1" }',
'{ "key12" : "-Math.pow(2, 53) -1" }',
'{ "key13" : {"key13-1" : "value13-1", "key13-2" : "value13-2"} }',
'{ "#$%^&*()@!~`-+=" : "special key14 name" }',
null
];
assist.jsonExpectedResults = [
{ key1: 1 },
{ key2: -3.1415 },
{ key3: false },
{ key4: null },
{ key5: "2018/11/01 18:30:00" },
{ key6: [ 1, 2, 3, 99 ] },
{
key7: [ 'json array1', 'json array2' ],
key8: [ true, false]
},
{ key9: '#$%^&*()@!~`-+=' },
{ key10: '_:;?><,.|/' },
{ key11: 'Math.pow(2, 53) -1' },
{ key12: '-Math.pow(2, 53) -1' },
{ key13: { 'key13-1': 'value13-1', 'key13-2': 'value13-2' } },
{ '#$%^&*()@!~`-+=': 'special key14 name' },
null
];
assist.schema = {
specialChars: [
'`',
'~',
'!',
'@',
'#',
'$',
'%',
'^',
'&',
'*',
'(',
')',
'-',
'+',
'=',
'[',
']',
'{',
'}',
'\\',
'|',
';',
':',
'\'',
'<',
'>',
',',
'.',
'?',
'/'
],
alphabet: [
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y',
'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x',
'y', 'z'
],
numbers: [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
]
};
assist.vectorValues = [
-999999.12345,
-314159.2654,
-12345.6789,
-99999.9999,
-87654.321,
43210.9876,
56789.0123,
65432.1098,
291828.1828,
987654.321
];
/******************************* Helper Functions ***********************************/
const StringBuffer = function() {
this.buffer = [];
this.index = 0;
};
StringBuffer.prototype = {
append: function(s) {
this.buffer[this.index] = s;
this.index += 1;
return this;
},
toString: function() {
return this.buffer.join("");
}
};
assist.createCharString = function(size) {
const buffer = new StringBuffer();
const scSize = assist.data.specialChars.length;
let scIndex = 0;
let cIndex = 0;
for (let i = 0; i < size; i++) {
if (i % 10 == 0) {
buffer.append(assist.data.specialChars[scIndex].substr(0, 1));
scIndex = (scIndex + 1) % scSize;
} else {
cIndex = Math.floor(Math.random() * 52); // generate a random integer among 0-51
buffer.append(assist.data.alphabet[cIndex]);
}
}
return buffer.toString();
};
assist.createBuffer = function(size) {
const array = [];
for (let i = 0; i < size; i++) {
const b = Math.floor(Math.random() * 256); // generate a random integer among 0-255
array.push(b);
}
return Buffer.from(array, "utf-8");
};
assist.createSchemaString = function(size) {
const buffer = new StringBuffer();
const schema_prefix = "\"";
let scIndex = 0;
let cIndex = 0;
let nIndex = 0;
for (let i = 0; i < size - 2; i++) {
if (i % 3 == 0) {
scIndex = Math.floor(Math.random() * 30);
buffer.append(assist.schema.specialChars[scIndex]);
} else if (i % 3 == 1) {
cIndex = Math.floor(Math.random() * 52);
buffer.append(assist.schema.alphabet[cIndex]);
} else {
nIndex = Math.floor(Math.random() * 10);
buffer.append(assist.schema.numbers[nIndex]);
}
}
return schema_prefix + buffer.toString() + schema_prefix;
};
assist.compare2Buffers = function(originalBuf, compareBuf) {
return originalBuf.equals(compareBuf);
};
assist.setUp = async function(connection, tableName, array) {
await assist.createTable(connection, tableName);
await assist.insertDataArray(connection, tableName, array);
};
assist.setUp4sql = async function(connection, tableName, array) {
await assist.createTable(connection, tableName);
await assist.insertData4sql(connection, tableName, array);
};
assist.createTable = async function(connection, tableName) {
const sqlCreate = assist.sqlCreateTable(tableName);
await connection.execute(sqlCreate);
};
assist.insertDataArray = async function(connection, tableName, array) {
const bindType = assist.allDataTypes[tableName];
await Promise.all(array.map(async function(element) {
await connection.execute(
`INSERT INTO ` + tableName + ` VALUES(:no, :bindValue)`,
{ no: array.indexOf(element), bindValue: {type: bindType, val: element} },
{ autoCommit: true });
}));
};
assist.insertData4sql = async function(connection, tableName, array) {
await Promise.all(array.map(async function(element) {
const sql = "INSERT INTO " + tableName + " VALUES(:no, " + element + " )";
const binds = { no: array.indexOf(element) };
await connection.execute(sql, binds);
}));
};
assist.sqlCreateTable = function(tableName) {
// The NOCOMPRESS option for CREATE TABLE ensures Hybrid Columnar Compression (HCC)
// is disabled for tables with LONG & LONG RAW columns in all types of Oracle DB.
// (Note: HCC is enabled in Oracle ADB-S and ADB-D by default)
// When HCC is enabled, tables with LONG & LONG RAW columns cannot be created.
const createTab =
`BEGIN
DECLARE
e_table_missing EXCEPTION;
PRAGMA EXCEPTION_INIT(e_table_missing, -00942);
BEGIN
EXECUTE IMMEDIATE ('DROP TABLE ${tableName} PURGE');
EXCEPTION
WHEN e_table_missing
THEN NULL;
END;
EXECUTE IMMEDIATE ('
CREATE TABLE ${tableName} (
num NUMBER(10),
content ${assist.allDataTypeNames[tableName]},
CONSTRAINT ${tableName}_pk PRIMARY KEY (num)
) NOCOMPRESS
');
END; `;
return createTab;
};
/************************* Functions for Verifiction *********************************/
assist.dataTypeSupport = async function(connection, tableName, array) {
const result = await connection.execute(
`SELECT * FROM ` + tableName + ` ORDER BY num`,
[],
{ outFormat: oracledb.OUT_FORMAT_OBJECT });
for (let i = 0; i < array.length; i++) {
// console.log(result.rows[i].CONTENT);
if ((typeof result.rows[i].CONTENT) === 'string')
assert.strictEqual(result.rows[i].CONTENT.trim(), array[result.rows[i].NUM]);
else if ((typeof result.rows[i].CONTENT) === 'number')
assert.strictEqual(result.rows[i].CONTENT, array[result.rows[i].NUM]);
else if (Buffer.isBuffer(result.rows[i].CONTENT))
assert.strictEqual(result.rows[i].CONTENT.toString('hex'), array[result.rows[i].NUM].toString('hex'));
else if (Object.prototype.toString.call(result.rows[i].CONTENT) === '[object Date]')
assert.strictEqual(result.rows[i].CONTENT.getTime(), array[result.rows[i].NUM].getTime());
else if (typeof result.rows[i].CONTENT === 'object')
assert.deepStrictEqual(result.rows[i].CONTENT, assist.jsonExpectedResults[result.rows[i].NUM]);
else
assert.ifError(new Error('Uncaught data type!'));
}
};
assist.verifyResultSet = async function(connection, tableName, array) {
const result = await connection.execute(
"SELECT * FROM " + tableName,
[],
{ resultSet: true, outFormat: oracledb.OUT_FORMAT_OBJECT });
assert.strictEqual((result.resultSet.metaData[0]).name, 'NUM');
assert.strictEqual((result.resultSet.metaData[1]).name, 'CONTENT');
await fetchRowsFromRS(result.resultSet, array);
};
assist.verifyRefCursor = async function(connection, tableName, array) {
const createProc =
`CREATE OR REPLACE PROCEDURE testproc (p_out OUT SYS_REFCURSOR) ` +
`AS ` +
`BEGIN ` +
` OPEN p_out FOR ` +
`SELECT * FROM ` + tableName + `; ` +
`END; `;
await connection.execute(createProc);
const result = await connection.execute(
`BEGIN testproc(:o); END;`,
[
{ type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
],
{ outFormat: oracledb.OUT_FORMAT_OBJECT });
await fetchRowsFromRS(result.outBinds[0], array);
await connection.execute(`DROP PROCEDURE testproc`);
};
async function fetchRowsFromRS(rs, array) {
const numRows = 3;
const rows = await rs.getRows(numRows);
if (rows.length > 0) {
for (let i = 0; i < rows.length; i++) {
if ((typeof rows[i].CONTENT) === 'string')
assert.strictEqual(rows[i].CONTENT.trim(), array[rows[i].NUM]);
else if ((typeof rows[i].CONTENT) === 'number')
assert.strictEqual(rows[i].CONTENT, array[rows[i].NUM]);
else if (Buffer.isBuffer(rows[i].CONTENT))
assert.strictEqual(rows[i].CONTENT.toString('hex'), array[rows[i].NUM].toString('hex'));
else if (Object.prototype.toString.call(rows[i].CONTENT) === '[object Date]')
assert.strictEqual(rows[i].CONTENT.getTime(), array[rows[i].NUM].getTime());
else if (typeof rows[i].CONTENT === 'object')
assert.deepStrictEqual(rows[i].CONTENT, assist.jsonExpectedResults[rows[i].NUM]);
else
assert.ifError(new Error('Uncaught data type!'));
}
return fetchRowsFromRS(rs, array);
} else {
await rs.close();
}
}
assist.selectOriginalData = async function(connection, tableName, array) {
await Promise.all(array.map(async function(element) {
await connection.execute(
`SELECT * FROM ` + tableName + ` WHERE num = :no`,
{ no: array.indexOf(element) });
}));
};
/* Null value verfication */
assist.verifyNullValues = async function(connection, tableName) {
const sqlInsert = `INSERT INTO ` + tableName + ` VALUES(:no, :bindValue)`;
const sqlCreate = await assist.sqlCreateTable(tableName);
await connection.execute(sqlCreate);
let num = 1;
await connection.execute(
sqlInsert,
{ no: num, bindValue: '' });
await verifyNull(num);
num = 2;
await connection.execute(
sqlInsert,
{ no: num, bindValue: null });
await verifyNull(num);
num = 3;
await connection.execute(
sqlInsert,
{ no: num, bindValue: undefined });
await verifyNull(num);
num = 4;
await connection.execute(
`INSERT INTO ` + tableName + ` VALUES(:1, NULL)`,
[num]);
await verifyNull(num);
num = 5;
await connection.execute(
`INSERT INTO ` + tableName + ` VALUES(:1, '')`,
[num]);
await verifyNull(num);
num = 6;
await connection.execute(`INSERT INTO ` + tableName + `(num) VALUES(:1)`,
[num]);
await verifyNull(num);
await connection.execute(`DROP table ` + tableName + ` PURGE`);
async function verifyNull(id) {
const result = await connection.execute(`SELECT content FROM ` + tableName + ` WHERE num = :1`,
[id]);
assert.deepStrictEqual(result.rows, [ [null] ]);
}
};
assist.compareNodejsVersion = function(nowVersion, comparedVersion) {
// return true if nowVersion > or = comparedVersion;
// else return false;
const now = nowVersion.split(".");
const compare = comparedVersion.split(".");
if (now[0] > compare[0]) {
return true;
} else if (now[0] === compare[0] && now[1] > compare[1]) {
return true;
} else if (now[0] === compare[0] && now[1] === compare[1] && now[2] > compare[2]) {
return true;
} else if (now[0] === compare[0] && now[1] === compare[1] && now[2] === compare[2]) {
return true;
} else {
return false;
}
};
assist.verifyRefCursorWithFetchInfo = async function(connection, tableName, array) {
const createProc =
`CREATE OR REPLACE PROCEDURE testproc (p_out OUT SYS_REFCURSOR) ` +
`AS ` +
`BEGIN ` +
` OPEN p_out FOR ` +
`SELECT * FROM ` + tableName + `; ` +
`END; `;
await connection.execute(createProc);
const result = await connection.execute(
`begin testproc(:out); end;`,
{
out: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
},
{
outFormat: oracledb.OUT_FORMAT_OBJECT,
fetchInfo:
{
"CONTENT": { type: oracledb.STRING }
}
});
await _verifyFetchedValues(connection, result.outBinds.out, array, tableName);
await connection.execute(`DROP PROCEDURE testproc`);
};
assist.verifyRefCursorWithFetchAsString = async function(connection, tableName, array) {
const createProc =
`CREATE OR REPLACE PROCEDURE testproc (p_out OUT SYS_REFCURSOR) ` +
`AS ` +
`BEGIN ` +
` OPEN p_out FOR ` +
`SELECT * FROM ` + tableName + `; ` +
`END; `;
await connection.execute(createProc);
const result = await connection.execute(
`begin testproc(:out); end;`,
{
out: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
},
{ outFormat: oracledb.OUT_FORMAT_OBJECT });
await _verifyFetchedValues(connection, result.outBinds.out, array, tableName);
await connection.execute(`DROP PROCEDURE testproc`);
};
const _verifyFetchedValues = async function(connection, rs, array, tableName) {
const amount = array.length;
const rows = await rs.getRows(amount);
const queryAndCompare = async function(row) {
const sql = `select content from ` + tableName + ` where num = ` + row.NUM;
const result = await connection.execute(
sql,
[],
{ fetchInfo: { "CONTENT": { type: oracledb.STRING } } });
assert.strictEqual(row.CONTENT, result.rows[0][0]);
};
await Promise.all(rows.map(async function(row) {
await queryAndCompare(row);
}));
await rs.close();
}; // await _verifyFetchedValues()
module.exports = assist;