Skip to content

Commit bdb4f85

Browse files
committed
Add dbColumnName property to metadata in query
1 parent 08ddf81 commit bdb4f85

File tree

10 files changed

+55
-3
lines changed

10 files changed

+55
-3
lines changed

doc/src/api_manual/connection.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,7 @@ Connection Methods
13691369

13701370
- ``annotations``: The `annotations <https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html#GUID-1AC16117-BBB6-4435-8794-2B99F8F68052>`__ object associated with the fetched column. If the column has no associated annotations, this attribute value is `undefined`. Annotations are supported from Oracle Database 23ai onwards. If node-oracledb Thick mode is used, Oracle Client 23ai is also required.
13711371
- ``byteSize``: The database byte size. This is only set for ``oracledb.DB_TYPE_VARCHAR``, ``oracledb.DB_TYPE_CHAR`` and ``oracledb.DB_TYPE_RAW`` column types.
1372+
- ``dbColumnName``: The actual database column name. This is to distinguish from the ``name`` attribute as the duplicate columns in the query will have the same value for this attribute.
13721373
- ``dbType``: one of the :ref:`Oracle Database Type Constant <oracledbconstantsdbtype>` values.
13731374
- ``dbTypeClass``: The class associated with the database type. This is only set if the database type is an object type.
13741375
- ``dbTypeName``: The name of the database type, such as “NUMBER” or “VARCHAR2”. For object types, this will be the object name.
@@ -1385,6 +1386,10 @@ Connection Methods
13851386
- ``vectorDimensions``: The number of dimensions of the VECTOR column. If the column is not a VECTOR column or allows for any number of dimensions, then the value of this attribute is *undefined*.
13861387
- ``vectorFormat``: The storage format of each dimension value in the VECTOR column. If the column is not a VECTOR column or allows for any storage format, then the value of this attribute is *undefined*.
13871388

1389+
.. versionchanged:: 6.10
1390+
1391+
The ``dbColumnName`` information attribute was added.
1392+
13881393
.. versionchanged:: 6.8
13891394

13901395
The ``isSparseVector`` information attribute was added.

doc/src/release_notes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ Common Changes
3535
#) Added error ``NJS-174`` which is thrown if payload type does not match the
3636
queue type in :ref:`Advanced Queuing <aq>`.
3737

38+
#) Added a new extended :ref:`metadata <execmetadata>` information attribute
39+
``dbColumnName`` for a fetched column which provides the actual database
40+
column name as opposed to the unique column name provided by the ``name``
41+
information attribute.
42+
3843
#) Fixed bug when attempting to use collection-specific methods for
3944
:ref:`database objects <dbobjectclass>` which is not actually a collection.
4045

lib/thin/protocol/messages/withData.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class MessageWithData extends Message {
236236
// build metadata
237237
const fetchInfo = {
238238
name: name,
239+
dbColumnName: name,
239240
dbType: types.getTypeByOraTypeNum(dataType, csfrm),
240241
nullable: nullable
241242
};

src/njsVariable.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,12 @@ bool njsVariable_getMetadataOne(njsVariable *var, napi_env env,
271271
// create object to store metadata on
272272
NJS_CHECK_NAPI(env, napi_create_object(env, metadata))
273273

274-
// store name
274+
// store name in "name" and "dbColumnName" properties initially
275275
NJS_CHECK_NAPI(env, napi_create_string_utf8(env, var->name,
276276
var->nameLength, &temp))
277277
NJS_CHECK_NAPI(env, napi_set_named_property(env, *metadata, "name", temp))
278+
NJS_CHECK_NAPI(env, napi_set_named_property(env, *metadata,
279+
"dbColumnName", temp))
278280

279281
// store database type, name and class, as needed
280282
if (!njsUtils_addTypeProperties(env, *metadata, "dbType",

test/binding.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,7 @@ describe('4. binding.js', function() {
913913
const expectedBind = {
914914
name: "STRINGVALUE",
915915
fetchType: oracledb.DB_TYPE_CHAR,
916+
dbColumnName: "STRINGVALUE",
916917
dbType: oracledb.DB_TYPE_CHAR,
917918
dbTypeName: "CHAR",
918919
nullable: true,

test/columnMetadata.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,9 @@ describe('9. columnMetadata.js', function() {
394394
it('9.5.1 works when using duplicate column alias', async function() {
395395
const result = await connection.execute("SELECT 1 a, 'abc' a FROM dual");
396396
assert.strictEqual(result.metaData[0].name, 'A');
397+
assert.strictEqual(result.metaData[0].dbColumnName, 'A');
397398
assert.strictEqual(result.metaData[1].name, 'A_1');
399+
assert.strictEqual(result.metaData[1].dbColumnName, 'A');
398400
});
399401
});
400402

test/dataTypeVector7.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ describe('309. dataTypeVector7.js', function() {
4545
const metaDataFloat64 = {
4646
name: "SPARSEVECTOR64COL",
4747
dbType: oracledb.DB_TYPE_VECTOR,
48+
dbColumnName: "SPARSEVECTOR64COL",
4849
nullable: true,
4950
isJson: false,
5051
isOson: false,
@@ -57,6 +58,7 @@ describe('309. dataTypeVector7.js', function() {
5758

5859
const metaDataFloat64Flex = {
5960
name: "SPARSEVECTORFLEX64COL",
61+
dbColumnName: "SPARSEVECTORFLEX64COL",
6062
dbType: oracledb.DB_TYPE_VECTOR,
6163
nullable: true,
6264
isJson: false,
@@ -69,6 +71,7 @@ describe('309. dataTypeVector7.js', function() {
6971

7072
const metaDataFloat32 = {
7173
name: "SPARSEVECTOR32COL",
74+
dbColumnName: "SPARSEVECTOR32COL",
7275
dbType: oracledb.DB_TYPE_VECTOR,
7376
nullable: true,
7477
isJson: false,
@@ -82,6 +85,7 @@ describe('309. dataTypeVector7.js', function() {
8285

8386
const metaDataFloat32Flex = {
8487
name: "SPARSEVECTORFLEX32COL",
88+
dbColumnName: "SPARSEVECTORFLEX32COL",
8589
dbType: oracledb.DB_TYPE_VECTOR,
8690
nullable: true,
8791
isJson: false,
@@ -94,6 +98,7 @@ describe('309. dataTypeVector7.js', function() {
9498

9599
const metaDataInt8Flex = {
96100
name: "SPARSEVECTORFLEX8COL",
101+
dbColumnName: "SPARSEVECTORFLEX8COL",
97102
dbType: oracledb.DB_TYPE_VECTOR,
98103
nullable: true,
99104
isJson: false,
@@ -106,6 +111,7 @@ describe('309. dataTypeVector7.js', function() {
106111

107112
const metaDataInt8 = {
108113
name: "SPARSEVECTOR8COL",
114+
dbColumnName: "SPARSEVECTOR8COL",
109115
dbType: oracledb.DB_TYPE_VECTOR,
110116
nullable: true,
111117
isJson: false,

test/dupColNames1.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2021, 2022, Oracle and/or its affiliates. */
1+
/* Copyright (c) 2021, 2025, Oracle and/or its affiliates. */
22

33
/******************************************************************************
44
*
@@ -152,9 +152,13 @@ describe('246. dupColNames1.js', function() {
152152

153153
const result = await connection.execute(sql);
154154
assert.equal(result.metaData[0].name, "EMPLOYEE_ID");
155+
assert.equal(result.metaData[0].dbColumnName, "EMPLOYEE_ID");
155156
assert.equal(result.metaData[1].name, "DEPARTMENT_ID");
157+
assert.equal(result.metaData[1].dbColumnName, "DEPARTMENT_ID");
156158
assert.equal(result.metaData[2].name, "DEPARTMENT_ID_1");
159+
assert.equal(result.metaData[2].dbColumnName, "DEPARTMENT_ID");
157160
assert.equal(result.metaData[3].name, "DEPARTMENT_NAME");
161+
assert.equal(result.metaData[3].dbColumnName, "DEPARTMENT_NAME");
158162
assert.equal(result.rows[0].EMPLOYEE_ID, 1001);
159163
assert.equal(result.rows[0].DEPARTMENT_ID, 101);
160164
assert.equal(result.rows[1].DEPARTMENT_ID_1, 201);
@@ -192,9 +196,13 @@ describe('246. dupColNames1.js', function() {
192196

193197
const result = await connection.execute(sql);
194198
assert.equal(result.metaData[0].name, "EMPLOYEE_ID");
199+
assert.equal(result.metaData[0].dbColumnName, "EMPLOYEE_ID");
195200
assert.equal(result.metaData[1].name, "DEPARTMENT_ID");
201+
assert.equal(result.metaData[1].dbColumnName, "DEPARTMENT_ID");
196202
assert.equal(result.metaData[2].name, "DEPARTMENT_ID_2");
203+
assert.equal(result.metaData[2].dbColumnName, "DEPARTMENT_ID");
197204
assert.equal(result.metaData[3].name, "DEPARTMENT_ID_1");
205+
assert.equal(result.metaData[3].dbColumnName, "DEPARTMENT_ID_1");
198206
assert.equal(result.rows[0].EMPLOYEE_ID, 1001);
199207
assert.equal(result.rows[0].DEPARTMENT_ID, 101);
200208
assert.equal(result.rows[0].DEPARTMENT_ID_1, 101);

test/getStmtInfo.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ describe('162. getStmtInfo.js', function() {
6666
dbTypeName: "NUMBER",
6767
fetchType: oracledb.DB_TYPE_NUMBER,
6868
name: "COL",
69+
dbColumnName: "COL",
6970
nullable: true,
7071
precision: 0,
7172
scale: -127,
@@ -500,7 +501,9 @@ describe('162. getStmtInfo.js', function() {
500501

501502
const info = await conn.getStatementInfo(sql);
502503
assert.strictEqual(info.metaData[0].name, 'A');
504+
assert.strictEqual(info.metaData[0].dbColumnName, 'A');
503505
assert.strictEqual(info.metaData[1].name, 'A_1');
506+
assert.strictEqual(info.metaData[1].dbColumnName, 'A');
504507
const result = await conn.execute(sql);
505508
assert.deepStrictEqual(result.rows[0], [1, 'abc']);
506509
});
@@ -510,23 +513,30 @@ describe('162. getStmtInfo.js', function() {
510513

511514
const info = await conn.getStatementInfo(sql);
512515
assert.strictEqual(info.metaData[0].name, 'NUM');
516+
assert.strictEqual(info.metaData[0].dbColumnName, 'NUM');
513517
assert.strictEqual(info.metaData[1].name, 'CONTENT');
518+
assert.strictEqual(info.metaData[1].dbColumnName, 'CONTENT');
514519
});
515520

516521
it('162.39 Mixed aliases and table columns', async function() {
517522
const sql = `SELECT num, content AS value, 'literal' AS lit FROM ${tableName}`;
518523

519524
const info = await conn.getStatementInfo(sql);
520525
assert.strictEqual(info.metaData[0].name, 'NUM');
526+
assert.strictEqual(info.metaData[0].dbColumnName, 'NUM');
521527
assert.strictEqual(info.metaData[1].name, 'VALUE');
528+
assert.strictEqual(info.metaData[1].dbColumnName, 'VALUE');
522529
assert.strictEqual(info.metaData[2].name, 'LIT');
530+
assert.strictEqual(info.metaData[2].dbColumnName, 'LIT');
523531
});
524532

525533
it('162.40 Very long column alias names', async function() {
526534
const longName = 'A'.repeat(30);
527535

528536
const sql = `SELECT 1 AS "${longName}", 2 AS "${longName}" FROM dual`;
529537
const info = await conn.getStatementInfo(sql);
538+
assert.strictEqual(info.metaData[0].dbColumnName, longName);
539+
assert.strictEqual(info.metaData[1].dbColumnName, longName);
530540
assert.notStrictEqual(info.metaData[0].name, info.metaData[1].name);
531541
});
532542

@@ -535,23 +545,29 @@ describe('162. getStmtInfo.js', function() {
535545

536546
const info = await conn.getStatementInfo(sql);
537547
assert.strictEqual(info.metaData[0].name, 'A');
548+
assert.strictEqual(info.metaData[0].dbColumnName, 'A');
538549
assert.strictEqual(info.metaData[1].name, 'A_1');
550+
assert.strictEqual(info.metaData[1].dbColumnName, 'A');
539551
});
540552

541553
it('162.42 Numeric aliases converted to strings', async function() {
542554
const sql = `SELECT 1 AS "1", 2 AS "1" FROM dual`;
543555

544556
const info = await conn.getStatementInfo(sql);
545557
assert.strictEqual(info.metaData[0].name, '1');
558+
assert.strictEqual(info.metaData[0].dbColumnName, '1');
546559
assert.strictEqual(info.metaData[1].name, '1_1');
560+
assert.strictEqual(info.metaData[1].dbColumnName, '1');
547561
});
548562

549563
it('162.43 Special character aliases', async function() {
550564
const sql = `SELECT 1 AS "@#$", 2 AS "@#$" FROM dual`;
551565

552566
const info = await conn.getStatementInfo(sql);
553567
assert.strictEqual(info.metaData[0].name, '@#$');
568+
assert.strictEqual(info.metaData[0].dbColumnName, '@#$');
554569
assert.strictEqual(info.metaData[1].name, '@#$_1');
570+
assert.strictEqual(info.metaData[1].dbColumnName, '@#$');
555571
});
556572

557573
it('162.44 Metadata consistency between output formats - duplicate aliases', async function() {
@@ -569,6 +585,8 @@ describe('162. getStmtInfo.js', function() {
569585
assert.deepStrictEqual(resultArray.metaData, resultObject.metaData);
570586

571587
assert.strictEqual(infoArray.metaData[0].name, 'A');
588+
assert.strictEqual(infoArray.metaData[0].dbColumnName, 'A');
572589
assert.strictEqual(infoArray.metaData[1].name, 'A_1');
590+
assert.strictEqual(infoArray.metaData[1].dbColumnName, 'A');
573591
});
574592
});

test/nestedCursor05.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2020, 2023, Oracle and/or its affiliates. */
1+
/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. */
22

33
/******************************************************************************
44
*
@@ -223,6 +223,7 @@ describe('236. nestedCursor05.js', () => {
223223
const stringMetaData = {
224224
name: 'DESCRIPTION',
225225
fetchType: oracledb.DB_TYPE_VARCHAR,
226+
dbColumnName: 'DESCRIPTION',
226227
dbType: oracledb.DB_TYPE_VARCHAR,
227228
dbTypeName: 'VARCHAR2',
228229
nullable: true,
@@ -233,13 +234,16 @@ describe('236. nestedCursor05.js', () => {
233234
assert.deepStrictEqual(result.metaData[0], stringMetaData);
234235
assert.strictEqual(result.metaData[1].name, 'CHILDREN');
235236
assert.strictEqual(result.metaData[1].fetchType, oracledb.DB_TYPE_CURSOR);
237+
assert.strictEqual(result.metaData[1].dbColumnName, 'CHILDREN');
236238
assert.strictEqual(result.metaData[1].dbType, oracledb.DB_TYPE_CURSOR);
237239
assert.strictEqual(result.metaData[1].dbTypeName, 'CURSOR');
238240

239241
assert.deepStrictEqual(result.metaData[1].metaData[0], stringMetaData);
240242
assert.strictEqual(result.metaData[1].metaData[1].name, 'GRANDCHILDREN');
241243
assert.strictEqual(result.metaData[1].metaData[1].fetchType,
242244
oracledb.DB_TYPE_CURSOR);
245+
assert.strictEqual(result.metaData[1].metaData[1].dbColumnName,
246+
'GRANDCHILDREN');
243247
assert.strictEqual(result.metaData[1].metaData[1].dbType,
244248
oracledb.DB_TYPE_CURSOR);
245249
assert.strictEqual(result.metaData[1].metaData[1].dbTypeName, 'CURSOR');

0 commit comments

Comments
 (0)