diff --git a/src/Strata.SqlTools.PostgreSql/Statements/StatementReader.cs b/src/Strata.SqlTools.PostgreSql/Statements/StatementReader.cs index 511f425..2320580 100644 --- a/src/Strata.SqlTools.PostgreSql/Statements/StatementReader.cs +++ b/src/Strata.SqlTools.PostgreSql/Statements/StatementReader.cs @@ -104,76 +104,39 @@ public class StatementReader : SqlServerStatementReader if (CurrentCharacter == '=') { - // Handle => operator (used in PostgreSQL for hstore and other operations) + // =, => (PostgreSQL hstore + other operations) MovePosition(); - if (CurrentCharacter == '>') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, "=>"); - return true; - } - // Single = is handled as regular operator + if (TryMatchTwoCharOperator('>', "=>")) return true; _currentToken = new Token(TokenType.Operator, "="); return true; } if (CurrentCharacter == '|') { - // Handle || concatenation operator + // |, || MovePosition(); - if (CurrentCharacter == '|') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, "||"); - return true; - } - // Single | is also an operator + if (TryMatchTwoCharOperator('|', "||")) return true; _currentToken = new Token(TokenType.Operator, "|"); return true; } if (CurrentCharacter == '<') { - // Handle <, <=, <>, << operators + // <, <=, <>, << MovePosition(); - if (CurrentCharacter == '=') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, "<="); - return true; - } - if (CurrentCharacter == '>') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, "<>"); - return true; - } - if (CurrentCharacter == '<') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, "<<"); - return true; - } + if (TryMatchTwoCharOperator('=', "<=")) return true; + if (TryMatchTwoCharOperator('>', "<>")) return true; + if (TryMatchTwoCharOperator('<', "<<")) return true; _currentToken = new Token(TokenType.Operator, "<"); return true; } if (CurrentCharacter == '>') { - // Handle >, >=, >> operators + // >, >=, >> MovePosition(); - if (CurrentCharacter == '=') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, ">="); - return true; - } - if (CurrentCharacter == '>') - { - MovePosition(); - _currentToken = new Token(TokenType.Operator, ">>"); - return true; - } + if (TryMatchTwoCharOperator('=', ">=")) return true; + if (TryMatchTwoCharOperator('>', ">>")) return true; _currentToken = new Token(TokenType.Operator, ">"); return true; } @@ -244,6 +207,23 @@ public class StatementReader : SqlServerStatementReader return stringValue.ToString(); } + + /// + /// If the position is currently sitting on , advances past it, + /// emits as the current Operator token, and returns + /// true. Otherwise leaves position untouched and returns false. Used by the + /// multi-character operator dispatch (e.g. </<=/<>/<<). + /// + private bool TryMatchTwoCharOperator(char nextChar, string twoCharOperator) + { + if (CurrentCharacter != nextChar) + { + return false; + } + MovePosition(); + _currentToken = new Token(TokenType.Operator, twoCharOperator); + return true; + } }