fix(editor): improve Oracle SQL completion

This commit is contained in:
zipg authored and GitHub committed 2026-07-13 17:29:56 +08:00
1 parent 8c11f2efaa
commit 00101ff0ac
2 files changed
+155 -3

No files matched your search

+75 -3
View File
@@ -465,6 +465,74 @@ const SQLSERVER_SQL_KEYWORDS = [
"SHOWPLAN_XML",
];
function sqlDialectCompletionWords(...sources: Array<string | undefined>): string[] {
return sources
.flatMap((source) => (source ?? "").split(/\s+/))
.filter((keyword) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(keyword))
.map((keyword) => keyword.toUpperCase());
}
const ORACLE_SQL_TYPES = [
"BFILE",
"BINARY_DOUBLE",
"BINARY_FLOAT",
"BLOB",
"CHAR",
"CLOB",
"DATE",
"DEC",
"DECIMAL",
"DOUBLE PRECISION",
"FLOAT",
"INT",
"INTEGER",
"INTERVAL DAY TO SECOND",
"INTERVAL YEAR TO MONTH",
"LONG",
"LONG RAW",
"NCHAR",
"NCLOB",
"NUMBER",
"NUMERIC",
"NVARCHAR2",
"RAW",
"REAL",
"ROWID",
"SMALLINT",
"TIMESTAMP",
"TIMESTAMP WITH LOCAL TIME ZONE",
"TIMESTAMP WITH TIME ZONE",
"UROWID",
"VARCHAR",
"VARCHAR2",
"XMLTYPE",
];
const NON_ORACLE_COMPLETION_WORDS = new Set(["BIGSERIAL", "BOOLEAN", "ELSEIF", "LIMIT", "LOCALTIME", "SERIAL", "STRING", "TEXT", "TIME", "USE"]);
const ORACLE_SQL_KEYWORDS = Array.from(
new Set([
...sqlDialectCompletionWords(PLSQL.spec.keywords).filter((keyword) => !NON_ORACLE_COMPLETION_WORDS.has(keyword)),
...ORACLE_SQL_TYPES,
"BULK COLLECT",
"CONNECT BY",
"DATABASE LINK",
"EXECUTE IMMEDIATE",
"FLASHBACK",
"FOR UPDATE",
"MATERIALIZED VIEW",
"MERGE",
"ORDER SIBLINGS BY",
"OR REPLACE",
"PACKAGE BODY",
"PURGE",
"RETURNING INTO",
"SEQUENCE",
"START WITH",
"TYPE BODY",
]),
);
const DATABASE_SQL_KEYWORDS: Partial<Record<DatabaseType, string[]>> = {
mysql: MYSQL_SQL_KEYWORDS,
postgres: POSTGRES_SQL_KEYWORDS,
@@ -473,6 +541,8 @@ const DATABASE_SQL_KEYWORDS: Partial<Record<DatabaseType, string[]>> = {
turso: SQLITE_SQL_KEYWORDS,
"cloudflare-d1": SQLITE_SQL_KEYWORDS,
sqlserver: SQLSERVER_SQL_KEYWORDS,
oracle: ORACLE_SQL_KEYWORDS,
"oceanbase-oracle": ORACLE_SQL_KEYWORDS,
manticoresearch: MANTICORESEARCH_SQL_KEYWORDS,
};
@@ -614,6 +684,7 @@ const DATA_TYPE_KEYWORDS = new Set([
"TINYBLOB",
"MEDIUMBLOB",
"LONGBLOB",
...ORACLE_SQL_TYPES,
]);
// Window functions that should use OVER() completion
@@ -3826,7 +3897,8 @@ function buildNonAggregatedColumnItems(context: SqlCompletionContext, columnsByT
function activeSqlKeywords(databaseType?: DatabaseType): string[] {
if (databaseType === "mongodb") return [];
const databaseKeywords = databaseType ? DATABASE_SQL_KEYWORDS[databaseType] : undefined;
return databaseType ? Array.from(new Set([...COMMON_SQL_KEYWORDS, ...(databaseKeywords ?? [])])) : Array.from(new Set(SQL_KEYWORDS));
const keywords = databaseType ? Array.from(new Set([...COMMON_SQL_KEYWORDS, ...(databaseKeywords ?? [])])) : Array.from(new Set(SQL_KEYWORDS));
return isOracleLikeDatabase(databaseType) ? keywords.filter((keyword) => !NON_ORACLE_COMPLETION_WORDS.has(keyword)) : keywords;
}
function isOracleLikeDatabase(databaseType?: DatabaseType): boolean {
@@ -3854,11 +3926,11 @@ function isPendingJoinKeywordContext(context: SqlCompletionContext): boolean {
function buildKeywordItems(prefix: string, context: SqlCompletionContext, databaseType?: DatabaseType, keywordCase?: SqlKeywordCase): SqlCompletionItem[] {
const isDml = context.statementKind === "select" || context.statementKind === "insert" || context.statementKind === "update" || context.statementKind === "delete";
const showDdl = !isDml || context.suggestTables;
const functionSignatures = activeFunctionSignatures(databaseType);
return activeSqlKeywords(databaseType)
.filter((keyword) => {
if (SQL_FUNCTION_SIGNATURES.has(keyword)) return false;
if (databaseType && DATABASE_FUNCTION_SIGNATURES[databaseType]?.has(keyword)) return false;
if (functionSignatures.has(keyword)) return false;
if (WINDOW_FUNCTIONS.has(keyword)) return false;
if (!matchesPrefix(keyword, prefix)) return false;
if (!showDdl && isDml && (DDL_ONLY_KEYWORDS.has(keyword) || DATA_TYPE_KEYWORDS.has(keyword))) return false;