Skip to content

Commit 1a21de2

Browse files
committed
Working numeric support
Signed-off-by: worksofliam <mrliamallan@live.co.uk>
1 parent e15ddf3 commit 1a21de2

File tree

4 files changed

+21
-3
lines changed

4 files changed

+21
-3
lines changed

src/language/sql/statement.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import SQLTokeniser, { NameTypes } from "./tokens";
22
import { CTEReference, CallableReference, ClauseType, ClauseTypeWord, IRange, ObjectRef, QualifiedObject, StatementType, StatementTypeWord, Token } from "./types";
33

4-
const tokenIs = (token: Token|undefined, type: string, value?: string) => {
4+
export const tokenIs = (token: Token|undefined, type: string, value?: string) => {
55
return (token && token.type === type && (value ? token.value?.toUpperCase() === value : true));
66
}
77

src/language/sql/tests/statements.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1386,7 +1386,7 @@ parserScenarios(`PL body tests`, ({newDoc}) => {
13861386

13871387
const parameterTokens = medianResultSetProc.getBlockAt(46);
13881388
expect(parameterTokens.length).toBeGreaterThan(0);
1389-
expect(parameterTokens.map(t => t.type).join()).toBe([`parmType`, `word`, `word`, `openbracket`, `word`, `comma`, `word`, `closebracket`].join());
1389+
expect(parameterTokens.map(t => t.type).join()).toBe([`parmType`, `word`, `word`, `openbracket`, `number`, `comma`, `number`, `closebracket`].join());
13901390

13911391
const numRecordsDeclare = statements[1];
13921392
expect(numRecordsDeclare.type).toBe(StatementType.Declare);

src/language/sql/tokens.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ interface TokenState {
2626

2727
export default class SQLTokeniser {
2828
static matchers: Matcher[] = [
29+
{
30+
name: `IS_NUMBER`,
31+
match: [
32+
{ type: `word`, match: (value: string) => {return !isNaN(Number(value)) && !isNaN(parseFloat(value)); }},
33+
],
34+
becomes: `number`,
35+
},
2936
{
3037
name: `PROCEDURE_PARM_TYPE`,
3138
match: [{ type: `word`, match: (value: string) => {return [`IN`, `OUT`, `INOUT`].includes(value.toUpperCase())}}],

src/views/results/binding.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { TextEditor } from "vscode";
22
import { getSqlDocument } from "../../language/providers/logic/parse";
33
import { StatementGroup } from "../../language/sql/types";
44
import { SqlParameter } from "./resultSetPanelProvider";
5+
import { tokenIs } from "../../language/sql/statement";
56

67
export function getPriorBindableStatement(editor: TextEditor, offset: number): string|undefined {
78
const sqlDocument = getSqlDocument(editor.document);
@@ -28,9 +29,19 @@ export function getPriorBindableStatement(editor: TextEditor, offset: number): s
2829
export function getLiteralsFromStatement(group: StatementGroup): SqlParameter[] {
2930
const literals: SqlParameter[] = [];
3031
for (const statement of group.statements) {
31-
for (const token of statement.tokens) {
32+
let tokens = statement.tokens;
33+
for (let i = 0; i < tokens.length; i++) {
34+
const token = tokens[i];
3235
if (token.type === `string`) {
3336
literals.push(token.value.substring(1, token.value.length - 1)); // Remove quotes
37+
} else if (token.type === `number`) {
38+
// Handle decimal numbers
39+
if (tokenIs(tokens[i+1], `number`) && tokenIs(tokens[i+2], `number`)) {
40+
literals.push(Number(`${token.value}.${tokens[i+2].value}`));
41+
i += 2; // Skip the next two tokens as they are part of the decimal number
42+
} else {
43+
literals.push(Number(token.value));
44+
}
3445
}
3546
}
3647
}

0 commit comments

Comments
 (0)