From 3e910123d258c73a84deaa544a50951fe48fbdca Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Mon, 1 Jul 2019 13:59:52 +0200 Subject: [PATCH] Resolve and infer types related to like expressions --- sqlparser/lib/src/analysis/types/resolver.dart | 10 ++++++++++ sqlparser/test/analysis/type_resolver_test.dart | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/sqlparser/lib/src/analysis/types/resolver.dart b/sqlparser/lib/src/analysis/types/resolver.dart index 412c110d..b1309cb6 100644 --- a/sqlparser/lib/src/analysis/types/resolver.dart +++ b/sqlparser/lib/src/analysis/types/resolver.dart @@ -89,6 +89,8 @@ class TypeResolver { [BasicType.int, BasicType.real, BasicType.text, BasicType.blob]); return ResolveResult(type); } + } else if (expr is StringComparisonExpression) { + return const ResolveResult(ResolvedType.bool()); } else if (expr is BetweenExpression) { return const ResolveResult(ResolvedType.bool()); } else if (expr is CaseExpression) { @@ -262,6 +264,14 @@ class TypeResolver { final relevant = parent.childNodes .lastWhere((node) => node is Expression && node != argument); return resolveExpression(relevant as Expression); + } else if (parent is StringComparisonExpression) { + if (argument == parent.escape) { + return const ResolveResult(ResolvedType(type: BasicType.text)); + } else { + final otherNode = parent.childNodes + .firstWhere((node) => node is Expression && node != argument); + return resolveExpression(otherNode as Expression); + } } else if (parent is Parentheses || parent is UnaryExpression) { return const ResolveResult.needsContext(); } else if (parent is FunctionExpression) { diff --git a/sqlparser/test/analysis/type_resolver_test.dart b/sqlparser/test/analysis/type_resolver_test.dart index 06176a14..6f447577 100644 --- a/sqlparser/test/analysis/type_resolver_test.dart +++ b/sqlparser/test/analysis/type_resolver_test.dart @@ -16,6 +16,10 @@ Map _types = { const ResolveResult(ResolvedType(type: BasicType.int)), 'UPDATE demo SET content = ? WHERE id = 3': const ResolveResult(ResolvedType(type: BasicType.text)), + 'SELECT * FROM demo WHERE content LIKE ?': + const ResolveResult(ResolvedType(type: BasicType.text)), + "SELECT * FROM demo WHERE content LIKE '%e' ESCAPE ?": + const ResolveResult(ResolvedType(type: BasicType.text)), }; void main() {