oracle - implemented scope identity

This commit is contained in:
Jan Prochazka
2024-12-11 12:37:58 +01:00
parent 3f45bfcdd0
commit d71452a397
4 changed files with 26 additions and 32 deletions

View File

@@ -183,17 +183,22 @@ describe('Query', () => {
test.each(engines.filter(x => !x.skipDataDuplicator).map(engine => [engine.label, engine]))( test.each(engines.filter(x => !x.skipDataDuplicator).map(engine => [engine.label, engine]))(
'Select scope identity - %s', 'Select scope identity - %s',
testWrapper(async (conn, driver, engine) => { testWrapper(async (conn, driver, engine) => {
const table = { await runCommandOnDriver(conn, driver, dmp =>
pureName: 't1', dmp.createTable({
columns: [ pureName: 't1',
{ columnName: 'id', dataType: 'int', notNull: true, autoIncrement: true }, columns: [
{ columnName: 'val', dataType: 'varchar(50)' }, { columnName: 'id', dataType: 'int', notNull: true, autoIncrement: true },
], { columnName: 'val', dataType: 'varchar(50)' },
primaryKey: { ],
columns: [{ columnName: 'id' }], primaryKey: {
}, columns: [{ columnName: 'id' }],
}; },
await runCommandOnDriver(conn, driver, dmp => dmp.createTable(table)); })
);
const structure = await driver.analyseFull(conn);
const table = structure.tables.find(x => x.pureName == 't1');
let res; let res;
if (driver.dialect.requireStandaloneSelectForScopeIdentity) { if (driver.dialect.requireStandaloneSelectForScopeIdentity) {
await runCommandOnDriver(conn, driver, dmp => dmp.put("INSERT INTO ~t1 (~val) VALUES ('aaa')")); await runCommandOnDriver(conn, driver, dmp => dmp.put("INSERT INTO ~t1 (~val) VALUES ('aaa')"));
@@ -205,13 +210,8 @@ describe('Query', () => {
}); });
} }
const row = res.rows[0]; const row = res.rows[0];
// console.log('*******************');
// console.log(JSON.stringify(res, null, 2));
// console.log(JSON.stringify(row, null, 2));
const keys = Object.keys(row); const keys = Object.keys(row);
// console.log(JSON.stringify(row, null, 2));
expect(keys.length).toEqual(1); expect(keys.length).toEqual(1);
// console.log(JSON.stringify(row[keys[0]], null, 2));
expect(row[keys[0]] == 1).toBeTruthy(); expect(row[keys[0]] == 1).toBeTruthy();
}) })
); );

View File

@@ -142,6 +142,9 @@ class Analyser extends DatabaseAnalyser {
..._.pick(col, ['columnName']), ..._.pick(col, ['columnName']),
})), })),
})), })),
identitySequenceName: (columnsGrouped[columnGroup(table)] || [])
.find(x => x?.default_value?.endsWith('.nextval'))
?.default_value?.match(/\"([^"]+)\"\.nextval/)?.[1],
}; };
}), }),
views: views.rows.map(view => ({ views: views.rows.map(view => ({

View File

@@ -109,23 +109,13 @@ class Dumper extends SqlDumper {
this.putCmd('^alter ^table %f ^modify (%i ^default ^null)', newcol, newcol.columnName); this.putCmd('^alter ^table %f ^modify (%i ^default ^null)', newcol, newcol.columnName);
} }
} }
}
// if (oldcol.notNull != newcol.notNull) { selectScopeIdentity(table) {
// if (newcol.notNull) this.putCmd('^alter ^table %f ^alter ^column %i ^set ^not ^null', newcol, newcol.columnName); const sequence = table.identitySequenceName;
// else this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^not ^null', newcol, newcol.columnName); if (sequence) {
// } this.put('^select %i.CURRVAL FROM DUAL', sequence);
// if (oldcol.defaultValue != newcol.defaultValue) { }
// if (newcol.defaultValue == null) {
// this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^default', newcol, newcol.columnName);
// } else {
// this.putCmd(
// '^alter ^table %f ^alter ^column %i ^set ^default %s',
// newcol,
// newcol.columnName,
// newcol.defaultValue
// );
// }
// }
} }
// putValue(value) { // putValue(value) {

View File

@@ -22,6 +22,7 @@ const dialect = {
}, },
userDatabaseNamePrefix: 'C##', userDatabaseNamePrefix: 'C##',
upperCaseAllDbObjectNames: true, upperCaseAllDbObjectNames: true,
requireStandaloneSelectForScopeIdentity: true,
createColumn: true, createColumn: true,
dropColumn: true, dropColumn: true,