Skip to content

Commit df33661

Browse files
committed
Better support for SQL naming vs system naming
Signed-off-by: worksofliam <[email protected]>
1 parent e27c2f7 commit df33661

File tree

6 files changed

+51
-21
lines changed

6 files changed

+51
-21
lines changed

src/connection/manager.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,25 @@ export class SQLJobManager {
118118
return this.jobs[jobExists];
119119
}
120120

121+
private resetCurrentSchema(query: string, job: OldSQLJob) {
122+
if (query.toUpperCase().startsWith(`SET`)) {
123+
const newSchema = query.split(` `)[2];
124+
if (newSchema) {
125+
job.resetCurrentSchemaCache();
126+
}
127+
}
128+
return query;
129+
}
130+
121131
async runSQL<T>(query: string, opts?: QueryOptions, rowsToFetch = 2147483647): Promise<T[]> {
122132
// 2147483647 is NOT arbitrary. On the server side, this is processed as a Java
123133
// int. This is the largest number available without overflow (Integer.MAX_VALUE)
124134

125135
const statement = await this.getPagingStatement<T>(query, opts);
126136
const results = await statement.execute(rowsToFetch);
127137
statement.close();
138+
139+
this.resetCurrentSchema(query, this.jobs[this.selectedJob].job);
128140
return results.data;
129141
}
130142

@@ -136,12 +148,15 @@ export class SQLJobManager {
136148
const results = await statement.execute(rowsToFetch);
137149
statement.close();
138150

151+
this.resetCurrentSchema(query, this.jobs[this.selectedJob].job);
139152
return results;
140153
}
141154

142155
async getPagingStatement<T>(query: string, opts?: QueryOptions): Promise<Query<T>> {
143-
const selected = this.jobs[this.selectedJob]
156+
const selected = this.jobs[this.selectedJob];
144157
if (ServerComponent.isInstalled() && selected) {
158+
this.resetCurrentSchema(query, selected?.job);
159+
145160
return selected.job.query<T>(query, opts);
146161

147162
} else if (!ServerComponent.isInstalled()) {

src/connection/sqlJob.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,25 @@ export class OldSQLJob extends SQLJob {
1414
private selfState: SelfValue = "*NONE";
1515

1616
id: string | undefined;
17+
private currentSchemaStore: string | undefined;
1718

1819
getSelfCode(): SelfValue {
1920
return this.selfState;
2021
}
2122

23+
resetCurrentSchemaCache() {
24+
this.currentSchemaStore = undefined;
25+
}
26+
2227
async getCurrentSchema(): Promise<string> {
2328
if (this.getNaming() === `sql`) {
29+
if (this.currentSchemaStore)
30+
return this.currentSchemaStore;
31+
2432
const result = await this.execute<{'00001': string}>(`values (current schema)`);
2533
if (result.success && result.data.length > 0) {
26-
return result.data[0]['00001'];
34+
this.currentSchemaStore = result.data[0]['00001'];
35+
return this.currentSchemaStore;
2736
}
2837
}
2938

src/language/providers/completionProvider.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ async function getCompletionItemsForTriggerDot(
219219
offset: number,
220220
trigger: string
221221
): Promise<CompletionItem[]> {
222+
const defaultLibrary = await getDefaultSchema();
222223
let list: CompletionItem[] = [];
223224

224225
const curRef = currentStatement.getReferenceByOffset(offset);
@@ -236,7 +237,7 @@ async function getCompletionItemsForTriggerDot(
236237
// Set the default schema for all references without one
237238
for (let ref of objectRefs) {
238239
if (!ref.object.schema) {
239-
ref.object.schema = getDefaultSchema();
240+
ref.object.schema = defaultLibrary;
240241
}
241242
}
242243

@@ -284,7 +285,7 @@ async function getCompletionItemsForTriggerDot(
284285
} else {
285286

286287
if (currentStatement.type === StatementType.Call) {
287-
const procs = await getProcedures([curRef], getDefaultSchema());
288+
const procs = await getProcedures([curRef], defaultLibrary);
288289
list.push(...procs);
289290

290291
} else {
@@ -332,6 +333,7 @@ function createCompletionItemForAlias(ref: ObjectRef) {
332333
}
333334

334335
async function getCompletionItemsForRefs(currentStatement: LanguageStatement.default, offset: number, cteColumns?: string[]) {
336+
const defaultSchema = await getDefaultSchema();
335337
const objectRefs = currentStatement.getObjectReferences();
336338
const cteList = currentStatement.getCTEReferences();
337339

@@ -350,7 +352,7 @@ async function getCompletionItemsForRefs(currentStatement: LanguageStatement.def
350352
// Set the default schema for all references without one
351353
for (let ref of objectRefs) {
352354
if (!ref.object.schema) {
353-
ref.object.schema = getDefaultSchema();
355+
ref.object.schema = defaultSchema;
354356
}
355357
}
356358

@@ -395,7 +397,7 @@ async function getCompletionItemsForRefs(currentStatement: LanguageStatement.def
395397
if (tokenAtOffset === undefined && (emptyObjectRefs || curClause !== ClauseType.Unknown)) {
396398
// get all the completion items for objects in each referenced schema
397399
completionItems.push(
398-
...(await getObjectCompletions(getDefaultSchema(), completionTypes))
400+
...(await getObjectCompletions(defaultSchema, completionTypes))
399401
);
400402
} else {
401403
// content assist invoked during incomplete reference
@@ -453,7 +455,7 @@ async function getCompletionItems(
453455
currentStatement: LanguageStatement.default|undefined,
454456
offset?: number
455457
) {
456-
458+
const defaultSchema = await getDefaultSchema();
457459
const s = currentStatement ? currentStatement.getTokenByOffset(offset) : null;
458460

459461
if (trigger === "." || (s && s.type === `dot`) || trigger === "/") {
@@ -479,7 +481,7 @@ async function getCompletionItems(
479481
if (currentStatement && currentStatement.type === StatementType.Call) {
480482
const curClause = currentStatement.getClauseForOffset(offset);
481483
if (curClause === ClauseType.Unknown) {
482-
return getProcedures(currentStatement.getObjectReferences(), getDefaultSchema());
484+
return getProcedures(currentStatement.getObjectReferences(), defaultSchema);
483485
}
484486
}
485487

@@ -623,7 +625,11 @@ export const completionProvider = languages.registerCompletionItemProvider(
623625
"/"
624626
);
625627

626-
const getDefaultSchema = (): string => {
628+
const getDefaultSchema = () => {
627629
const currentJob = JobManager.getSelection();
628-
return currentJob && currentJob.job.options.libraries[0] ? currentJob.job.options.libraries[0] : `QGPL`;
630+
if (currentJob) {
631+
return currentJob.job.getCurrentSchema()
632+
} else {
633+
return Promise.resolve(`QGPL`);
634+
}
629635
}

src/language/providers/hoverProvider.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@ import { CallableSignature } from "../../database/callable";
1515

1616
export const openProvider = workspace.onDidOpenTextDocument(async (document) => {
1717
if (document.languageId === `sql`) {
18-
if (remoteAssistIsEnabled()) {
18+
const selected = remoteAssistIsEnabled();
19+
20+
if (selected) {
1921
const sqlDoc = getSqlDocument(document);
20-
const defaultSchema = getDefaultSchema();
22+
const defaultSchema = await selected.job.getCurrentSchema();
2123

2224
if (!sqlDoc) return;
2325

26+
// TODO: we need to stop hard coding default schema here!!
27+
2428
for (const statement of sqlDoc.statements) {
2529
const refs = statement.getObjectReferences();
2630
if (refs.length) {
@@ -60,9 +64,10 @@ export const openProvider = workspace.onDidOpenTextDocument(async (document) =>
6064

6165
export const hoverProvider = languages.registerHoverProvider({ language: `sql` }, {
6266
async provideHover(document, position, token) {
63-
if (!remoteAssistIsEnabled(true)) return;
67+
const selected = remoteAssistIsEnabled(true);
68+
if (!selected) return;
6469

65-
const defaultSchema = getDefaultSchema();
70+
const defaultSchema = await selected.job.getCurrentSchema();
6671
const sqlDoc = getSqlDocument(document);
6772
const offset = document.offsetAt(position);
6873

@@ -193,9 +198,4 @@ function lookupSymbol(name: string, schema: string | undefined, possibleNames: s
193198
schema = schema ? Statement.noQuotes(Statement.delimName(schema, true)) : undefined
194199

195200
return DbCache.lookupSymbol(name, schema, possibleNames);
196-
}
197-
198-
const getDefaultSchema = (): string => {
199-
const currentJob = JobManager.getSelection();
200-
return currentJob && currentJob.job.options.libraries[0] ? currentJob.job.options.libraries[0] : `QGPL`;
201201
}

src/language/providers/peekProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const peekProvider = languages.registerDefinitionProvider({ language: `sq
1414

1515
if (!currentJob) return;
1616

17-
const defaultSchema = currentJob.job.getCurrentSchema();
17+
const defaultSchema = await currentJob.job.getCurrentSchema();
1818
const naming = currentJob.job.getNaming();
1919

2020
const sqlDoc = getSqlDocument(document);

src/views/jobManager/editJob/systemTab.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default function getSystemTab(options: JDBCOptions) {
2929
.addInput(
3030
`libraries`,
3131
`Library list`,
32-
`List of system libraries, separated by commas or spaces. First entry is the default library / current schema, and the remaining items make up the library list.`,
32+
`List of system libraries, separated by commas or spaces. First entry is the default library, and the remaining items make up the library list. The library list is typically not used when SQL naming is used.`,
3333
{ rows: 2, default: options.libraries ? options.libraries.join(`, `) : `QGPL` }
3434
)
3535
.addSelect(

0 commit comments

Comments
 (0)