Skip to content

Commit 4bac861

Browse files
authored
Merge pull request #271 from codefori/fix/content_assist_for_routines
Fix bug where parameters and columns were sharing the same cache keys
2 parents ab9f878 + 32b3138 commit 4bac861

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

src/language/providers/callable.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import Callable, { CallableSignature, CallableType } from "../../database/callab
33
import { ObjectRef, QualifiedObject, CallableReference } from "../sql/types";
44
import Statement from "../../database/statement";
55
import { completionItemCache, createCompletionItem, getParmAttributes } from "./completion";
6+
import { toKey } from "./completionItemCache";
7+
8+
const SIGNATURE_CONTEXT_KEY = `sigs`;
69

710
/**
811
* Checks if the ref exists as a procedure or function. Then,
@@ -13,7 +16,7 @@ export async function isCallableType(ref: ObjectRef, type: CallableType) {
1316
ref.object.schema = Statement.noQuotes(Statement.delimName(ref.object.schema, true));
1417
ref.object.name = Statement.noQuotes(Statement.delimName(ref.object.name, true));
1518

16-
const cacheKey = toCacheKey(ref.object);
19+
const cacheKey = toKey(SIGNATURE_CONTEXT_KEY, ref.object);
1720

1821
if (completionItemCache.has(cacheKey)) {
1922
return true;
@@ -149,12 +152,8 @@ export function getPositionData(ref: CallableReference, offset: number) {
149152
}
150153

151154
export function getCachedSignatures(ref: CallableReference): CallableSignature[] | undefined {
152-
const key = toCacheKey(ref.parentRef.object);
155+
const key = toKey(SIGNATURE_CONTEXT_KEY, ref.parentRef.object);
153156
if (completionItemCache.has(key)) {
154157
return completionItemCache.get(key);
155158
}
156-
}
157-
158-
function toCacheKey(sqlObj: QualifiedObject): string {
159-
return sqlObj.schema + sqlObj.name;
160159
}

src/language/providers/completionItemCache.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { CompletionItem } from "vscode";
22
import LRU from "lru-cache";
3+
import { QualifiedObject } from "../sql/types";
34

45
export let changedCache: Set<string> = new Set<string>();
56

@@ -15,3 +16,7 @@ export default class CompletionItemCache extends LRU {
1516
});
1617
}
1718
}
19+
20+
export function toKey(context: string, sqlObj: QualifiedObject|string) {
21+
return `${context}-` + (typeof sqlObj === `string` ? sqlObj : `${sqlObj.schema}.${sqlObj.name}`).toUpperCase();
22+
}

src/language/providers/completionProvider.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Table from "../../database/table";
1010
import Document from "../sql/document";
1111
import * as LanguageStatement from "../sql/statement";
1212
import { CTEReference, CallableReference, ClauseType, ObjectRef, StatementType } from "../sql/types";
13-
import CompletionItemCache, { changedCache } from "./completionItemCache";
13+
import CompletionItemCache, { changedCache, toKey } from "./completionItemCache";
1414
import Callable, { CallableType } from "../../database/callable";
1515
import { ServerComponent } from "../../connection/serverComponent";
1616
import { prepareParamType, createCompletionItem, getParmAttributes, completionItemCache } from "./completion";
@@ -91,10 +91,11 @@ async function getObjectColumns(
9191
isUDTF = false
9292
): Promise<CompletionItem[]> {
9393

94-
const databaseObj = (schema + name).toUpperCase();
95-
const tableUpdate: boolean = changedCache.delete(databaseObj);
94+
const cacheKey = toKey(`columns`, schema + name)
95+
const tableUpdate: boolean = changedCache.delete(cacheKey);
96+
const isCached = completionItemCache.has(cacheKey);
9697

97-
if (!completionItemCache.has(databaseObj) || tableUpdate) {
98+
if (!isCached || tableUpdate) {
9899
schema = Statement.noQuotes(Statement.delimName(schema, true));
99100
name = Statement.noQuotes(Statement.delimName(name, true));
100101

@@ -104,7 +105,7 @@ async function getObjectColumns(
104105
const resultSet = await Callable.getResultColumns(schema, name, true);
105106

106107
if (!resultSet?.length ? true : false) {
107-
completionItemCache.set(databaseObj, []);
108+
completionItemCache.set(cacheKey, []);
108109
return [];
109110
}
110111

@@ -122,7 +123,7 @@ async function getObjectColumns(
122123
const columns = await Table.getItems(schema, name);
123124

124125
if (!columns?.length ? true : false) {
125-
completionItemCache.set(databaseObj, []);
126+
completionItemCache.set(cacheKey, []);
126127
return [];
127128
}
128129

@@ -139,9 +140,10 @@ async function getObjectColumns(
139140

140141
const allCols = getAllColumns(name, schema, completionItems);
141142
completionItems.push(allCols);
142-
completionItemCache.set(databaseObj, completionItems);
143+
completionItemCache.set(cacheKey, completionItems);
143144
}
144-
return completionItemCache.get(databaseObj);
145+
146+
return completionItemCache.get(cacheKey);
145147
}
146148

147149
/**
@@ -172,6 +174,7 @@ async function getObjectCompletions(
172174
.filter((result) => result.status == "fulfilled")
173175
.map((result) => (result as PromiseFulfilledResult<any>).value)
174176
.flat();
177+
175178
completionItemCache.set(forSchema, list);
176179
}
177180
return completionItemCache.get(forSchema);

0 commit comments

Comments
 (0)