Skip to content

Commit cecfb50

Browse files
committed
Fix bug where parameters and columns were sharing the same cache keys
Signed-off-by: worksofliam <[email protected]>
1 parent ab9f878 commit cecfb50

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

src/language/providers/callable.ts

Lines changed: 7 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;
@@ -23,10 +26,12 @@ export async function isCallableType(ref: ObjectRef, type: CallableType) {
2326

2427
if (callableRoutine) {
2528
const parms = await Callable.getSignaturesFor(ref.object.schema, callableRoutine.specificNames);
29+
console.log(`Set: ${cacheKey}, length: ${parms.length}`);
2630
completionItemCache.set(cacheKey, parms);
2731
return true;
2832
} else {
2933
// Not callable, let's just cache it as empty to stop spamming the db
34+
console.log(`Set: ${cacheKey}, length: 0`);
3035
completionItemCache.set(cacheKey, []);
3136
}
3237
}
@@ -149,12 +154,8 @@ export function getPositionData(ref: CallableReference, offset: number) {
149154
}
150155

151156
export function getCachedSignatures(ref: CallableReference): CallableSignature[] | undefined {
152-
const key = toCacheKey(ref.parentRef.object);
157+
const key = toKey(SIGNATURE_CONTEXT_KEY, ref.parentRef.object);
153158
if (completionItemCache.has(key)) {
154159
return completionItemCache.get(key);
155160
}
156-
}
157-
158-
function toCacheKey(sqlObj: QualifiedObject): string {
159-
return sqlObj.schema + sqlObj.name;
160161
}

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: 15 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,12 @@ 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 cached = completionItemCache.get(cacheKey);
97+
const isCached = completionItemCache.has(cacheKey);
9698

97-
if (!completionItemCache.has(databaseObj) || tableUpdate) {
99+
if (cached === undefined || tableUpdate) {
98100
schema = Statement.noQuotes(Statement.delimName(schema, true));
99101
name = Statement.noQuotes(Statement.delimName(name, true));
100102

@@ -104,7 +106,8 @@ async function getObjectColumns(
104106
const resultSet = await Callable.getResultColumns(schema, name, true);
105107

106108
if (!resultSet?.length ? true : false) {
107-
completionItemCache.set(databaseObj, []);
109+
console.log(`Set: ${cacheKey}, length: ${resultSet.length}`);
110+
completionItemCache.set(cacheKey, []);
108111
return [];
109112
}
110113

@@ -122,7 +125,8 @@ async function getObjectColumns(
122125
const columns = await Table.getItems(schema, name);
123126

124127
if (!columns?.length ? true : false) {
125-
completionItemCache.set(databaseObj, []);
128+
console.log(`Set: ${cacheKey}, length: ${columns.length}`);
129+
completionItemCache.set(cacheKey, []);
126130
return [];
127131
}
128132

@@ -139,9 +143,10 @@ async function getObjectColumns(
139143

140144
const allCols = getAllColumns(name, schema, completionItems);
141145
completionItems.push(allCols);
142-
completionItemCache.set(databaseObj, completionItems);
146+
console.log(`Set: ${cacheKey}, length: ${completionItems.length}`);
147+
completionItemCache.set(cacheKey, completionItems);
143148
}
144-
return completionItemCache.get(databaseObj);
149+
return completionItemCache.get(cacheKey);
145150
}
146151

147152
/**
@@ -172,6 +177,8 @@ async function getObjectCompletions(
172177
.filter((result) => result.status == "fulfilled")
173178
.map((result) => (result as PromiseFulfilledResult<any>).value)
174179
.flat();
180+
181+
console.log(`Set: ${forSchema}, length: ${list.length}`);
175182
completionItemCache.set(forSchema, list);
176183
}
177184
return completionItemCache.get(forSchema);

0 commit comments

Comments
 (0)