Skip to content

Commit 0a8813e

Browse files
committed
count(distinct colum1, ..., columnN)
1 parent 3e78e27 commit 0a8813e

3 files changed

Lines changed: 15 additions & 9 deletions

File tree

src/client/compiler/parser/AST.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ export type MethodcallNode = {
257257
rightBracketPosition: TextPosition,
258258
identifier: string,
259259
operands: TermNode[],
260-
commaPositions: TextPosition[]
260+
commaPositions: TextPosition[],
261+
distinctBeforeParameters: boolean
261262
}
262263

263264
export type UnaryOpNode = {

src/client/compiler/parser/Parser.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2188,7 +2188,8 @@ export class Parser {
21882188
rightBracketPosition: rightBracketPosition,
21892189
operands: parameters.nodes,
21902190
identifier: identifier1,
2191-
commaPositions: parameters.commaPositions
2191+
commaPositions: parameters.commaPositions,
2192+
distinctBeforeParameters: parameters.distinctBeforeParameters
21922193
}
21932194
} else {
21942195
term = {
@@ -2294,13 +2295,14 @@ export class Parser {
22942295
}
22952296

22962297

2297-
parseMethodCallParameters(): { rightBracketPosition: TextPosition, nodes: TermNode[], commaPositions: TextPosition[] } {
2298+
parseMethodCallParameters(): { rightBracketPosition: TextPosition, nodes: TermNode[], commaPositions: TextPosition[], distinctBeforeParameters: boolean } {
22982299
// Assumption: current token is (
22992300
this.nextToken();
2301+
let distinctBeforeParameters = this.comesToken(TokenType.keywordDistinct, true);
23002302
if (this.tt == TokenType.rightBracket) {
23012303
let rightBracketPosition = this.getCurrentPosition();
23022304
this.nextToken();
2303-
return { rightBracketPosition: rightBracketPosition, nodes: [], commaPositions: [] };
2305+
return { rightBracketPosition: rightBracketPosition, nodes: [], commaPositions: [], distinctBeforeParameters: distinctBeforeParameters };
23042306
}
23052307

23062308
let parameters: TermNode[] = [];
@@ -2339,7 +2341,7 @@ export class Parser {
23392341
let position = this.getCurrentPosition();
23402342
let rightBracketFound = this.expect(TokenType.rightBracket, true);
23412343

2342-
return { rightBracketPosition: rightBracketFound ? position : null, nodes: parameters, commaPositions: commaPositions };
2344+
return { rightBracketPosition: rightBracketFound ? position : null, nodes: parameters, commaPositions: commaPositions, distinctBeforeParameters: distinctBeforeParameters };
23432345

23442346
}
23452347

@@ -2369,7 +2371,8 @@ export class Parser {
23692371
rightBracketPosition: parameters.rightBracketPosition,
23702372
operands: parameters.nodes,
23712373
identifier: identifier,
2372-
commaPositions: parameters.commaPositions
2374+
commaPositions: parameters.commaPositions,
2375+
distinctBeforeParameters: parameters.distinctBeforeParameters
23732376
}
23742377
}
23752378
// else {

src/client/compiler/parser/SymbolResolver.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,10 @@ export class SymbolResolver {
594594

595595
return node.sqlType;
596596
} else {
597-
598-
methods = methods.filter(m => m.parameters.length == node.operands.length);
597+
let isCountMethod = node.identifier.toLocaleLowerCase() == "count";
598+
if(!isCountMethod){
599+
methods = methods.filter(m => m.parameters.length == node.operands.length);
600+
}
599601
if (node.operands.length == 1 && node.operands[0].type == TokenType.allColumns) {
600602
methods = methods.filter(m => m.acceptsStarParameter);
601603
node.sqlType = methods[0].returnType;
@@ -624,7 +626,7 @@ export class SymbolResolver {
624626
break;
625627
}
626628
}
627-
if (found) {
629+
if (found || isCountMethod) {
628630
node.sqlType = method.returnType;
629631
return node.sqlType;
630632
}

0 commit comments

Comments
 (0)