Skip to content

Commit 13ef4ea

Browse files
committed
#833 Recognize named argument operator in tokenizer
1 parent e6379de commit 13ef4ea

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

src/main/org/firebirdsql/jaybird/parser/OperatorToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* The term operator is taken very broadly, and includes mathematical operators ({@code + - / *}, boolean operators
99
* ({@code and or is not} and comparison operators ({@code = <> > < >= <= != ~= ^= !< ~< ^< !> ~> ^>} and the prefix of
1010
* those operators ({@code ! ~ ^} if they appear individually in the statement (which is a syntax error in Firebird),
11-
* and the scope specifier ({@code %}).
11+
* the scope specifier ({@code %}), and the named parameter operator ({@code =>}).
1212
* </p>
1313
*
1414
* @author Mark Rotteveel

src/main/org/firebirdsql/jaybird/parser/SqlTokenizer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,16 @@ private int peek() {
164164
}
165165
case '+',
166166
'%', // Firebird 6.0 scope specifier
167-
'*', // Can also signify 'all' (as in select * or select alias.*)
168-
'=' -> new OperatorToken(start, src, start, pos);
167+
'*' // Can also signify 'all' (as in select * or select alias.*)
168+
-> new OperatorToken(start, src, start, pos);
169+
case '=' -> {
170+
int cNext = read();
171+
// Handling for Firebird 6.0 => (named parameter operator)
172+
if (cNext != '>') {
173+
unread(cNext);
174+
}
175+
yield new OperatorToken(start, src, start, pos);
176+
}
169177
case '-' -> {
170178
if (peek() == '-') {
171179
yield readLineComment(start);

src/test/org/firebirdsql/jaybird/parser/SqlTokenizerTest.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: Copyright 2021-2025 Mark Rotteveel
1+
// SPDX-FileCopyrightText: Copyright 2021-2026 Mark Rotteveel
22
// SPDX-License-Identifier: LGPL-2.1-or-later
33
package org.firebirdsql.jaybird.parser;
44

@@ -71,6 +71,8 @@ static Stream<Arguments> singularTokensProvider() {
7171
arguments("^>", new OperatorToken(0, "^>")),
7272
arguments("^<", new OperatorToken(0, "^<")),
7373
arguments("||", new OperatorToken(0, "||")),
74+
arguments("%", new OperatorToken(0, "%")),
75+
arguments("=>", new OperatorToken(0, "=>")),
7476
arguments(":", new ColonToken(0)),
7577
arguments("?", new PositionalParameterToken(0)),
7678
arguments("and", new OperatorToken(0, "and")),
@@ -254,6 +256,38 @@ void simpleColumnList() {
254256

255257
}
256258

259+
@Test
260+
void namedArgumentsList() {
261+
String statementText = "select function_name(parameter2 => 'Two', parameter1 => 1) from rdb$database";
262+
263+
var tokenizer = SqlTokenizer.withReservedWords(FirebirdReservedWords.latest())
264+
.of(statementText);
265+
266+
assertThat(tokenizer).toIterable().containsExactly(
267+
new ReservedToken(0, "select"),
268+
new WhitespaceToken(6, " "),
269+
new GenericToken(7, "function_name"),
270+
new ParenthesisOpen(20),
271+
new GenericToken(21, "parameter2"),
272+
new WhitespaceToken(31, " "),
273+
new OperatorToken(32, "=>"),
274+
new WhitespaceToken(34, " "),
275+
new StringLiteralToken(35, "'Two'"),
276+
new CommaToken(40),
277+
new WhitespaceToken(41, " "),
278+
new GenericToken(42, "parameter1"),
279+
new WhitespaceToken(52, " "),
280+
new OperatorToken(53, "=>"),
281+
new WhitespaceToken(55, " "),
282+
new NumericLiteralToken(56, "1"),
283+
new ParenthesisClose(57),
284+
new WhitespaceToken(58, " "),
285+
new ReservedToken(59, "from"),
286+
new WhitespaceToken(63, " "),
287+
new GenericToken(64, "rdb$database")
288+
);
289+
}
290+
257291
private static void expectSingleToken(String input, Token expectedToken) {
258292
SqlTokenizer tokenizer = SqlTokenizer.withReservedWords(FirebirdReservedWords.latest()).of(input);
259293

0 commit comments

Comments
 (0)