diff --git a/sqlparser/lib/src/analysis/types2/resolving_visitor.dart b/sqlparser/lib/src/analysis/types2/resolving_visitor.dart index 0127a256..715920ce 100644 --- a/sqlparser/lib/src/analysis/types2/resolving_visitor.dart +++ b/sqlparser/lib/src/analysis/types2/resolving_visitor.dart @@ -263,6 +263,7 @@ class TypeResolver extends RecursiveVisitor { visitChildren(e, _expectNum); session + .._checkAndResolve(e, const ResolvedType.bool(), arg) .._addRelation(NullableIfSomeOtherIs(e, e.childNodes)) .._addRelation(HaveSameType(e.lower, e.upper)) .._addRelation(HaveSameType(e.check, e.lower)); diff --git a/sqlparser/test/analysis/types2/resolver_test.dart b/sqlparser/test/analysis/types2/resolver_test.dart index 129e5660..bb9584c5 100644 --- a/sqlparser/test/analysis/types2/resolver_test.dart +++ b/sqlparser/test/analysis/types2/resolver_test.dart @@ -233,6 +233,27 @@ WITH RECURSIVE expect(type, const ResolvedType(type: BasicType.int)); }); + test('resolves type hints from between expressions', () { + const dateTime = ResolvedType(type: BasicType.int, hint: IsDateTime()); + final session = _obtainResolver( + 'SELECT 1 WHERE :date BETWEEN :start AND :end', + options: const AnalyzeStatementOptions( + namedVariableTypes: {':date': dateTime}, + ), + ).session; + + Variable start, end; + for (final variable in session.context.root.allDescendants + .whereType()) { + if (variable.name == ':start') start = variable; + if (variable.name == ':end') end = variable; + } + assert(start != null && end != null); + + expect(session.typeOf(start), dateTime); + expect(session.typeOf(end), dateTime); + }); + group('IS IN expressions', () { test('infer the variable as an array type', () { final type = _resolveFirstVariable('SELECT 3 IN ?');