@@ -3,7 +3,10 @@ import { parser, parse as parseRaw } from "../parser/parser"
33import { visitor } from "../parser/visitor"
44import { QuestDBLexer } from "../parser/lexer"
55import type { Statement } from "../parser/ast"
6- import { IDENTIFIER_KEYWORD_TOKENS } from "./token-classification"
6+ import {
7+ IDENTIFIER_KEYWORD_TOKENS ,
8+ EXPRESSION_OPERATORS ,
9+ } from "./token-classification"
710
811// =============================================================================
912// Constants
@@ -85,6 +88,8 @@ export interface ContentAssistResult {
8588 * context. Used by the provider to boost tables containing all these columns.
8689 */
8790 referencedColumns : Set < string >
91+ /** Whether the cursor is inside a WHERE clause expression */
92+ isConditionContext : boolean
8893}
8994
9095// =============================================================================
@@ -683,6 +688,7 @@ interface ComputeResult {
683688 nextTokenTypes : TokenType [ ]
684689 suggestColumns : boolean
685690 suggestTables : boolean
691+ isConditionContext : boolean
686692}
687693
688694/**
@@ -767,7 +773,21 @@ function computeSuggestions(tokens: IToken[]): ComputeResult {
767773 }
768774 }
769775
770- return { nextTokenTypes : result , suggestColumns, suggestTables }
776+ // Check if an expression operator's ruleStack includes "whereClause".
777+ // Must check operators specifically — Chevrotain explores ahead into
778+ // not-yet-started WHERE paths even from JOIN ON positions.
779+ const isConditionContext = effectiveSuggestions . some (
780+ ( s ) =>
781+ EXPRESSION_OPERATORS . has ( s . nextTokenType . name ) &&
782+ s . ruleStack . includes ( "whereClause" ) ,
783+ )
784+
785+ return {
786+ nextTokenTypes : result ,
787+ suggestColumns,
788+ suggestTables,
789+ isConditionContext,
790+ }
771791}
772792
773793/**
@@ -906,6 +926,7 @@ export function getContentAssist(
906926 suggestColumns : false ,
907927 suggestTables : false ,
908928 referencedColumns : new Set ( ) ,
929+ isConditionContext : false ,
909930 }
910931 }
911932 }
@@ -934,11 +955,13 @@ export function getContentAssist(
934955 let nextTokenTypes : TokenType [ ] = [ ]
935956 let suggestColumns = false
936957 let suggestTables = false
958+ let isConditionContext = false
937959 try {
938960 const computed = computeSuggestions ( tokensForAssist )
939961 nextTokenTypes = computed . nextTokenTypes
940962 suggestColumns = computed . suggestColumns
941963 suggestTables = computed . suggestTables
964+ isConditionContext = computed . isConditionContext
942965 } catch ( e ) {
943966 // If content assist fails, return empty suggestions
944967 // This can happen with malformed input
@@ -1025,6 +1048,7 @@ export function getContentAssist(
10251048 suggestColumns,
10261049 suggestTables,
10271050 referencedColumns,
1051+ isConditionContext,
10281052 }
10291053}
10301054
0 commit comments