Author: kostat
Date: 2007-12-24 07:59:33 -0500 (Mon, 24 Dec 2007)
New Revision: 91856
Modified:
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
Log:
add support for string concat (+)
Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/ChangeLog
2007-12-24 12:59:33 UTC (rev 91856)
@@ -1,3 +1,7 @@
+2007-12-24 Konstantin Triger <[EMAIL PROTECTED]>
+
+ * Parser.jay, StringFunctions.cs, Like.cs: add support for string
concat.
+
2007-07-26 Nagappan A <[EMAIL PROTECTED]>
* Comparison.cs (Compare): Should always parse the object of type
Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Like.cs
2007-12-24 12:59:33 UTC (rev 91856)
@@ -36,26 +36,11 @@
namespace Mono.Data.SqlExpressions {
internal class Like : UnaryExpression {
- string pattern;
- bool openStart, openEnd;
+ readonly IExpression _pattern;
- public Like (IExpression e, string pattern) : base (e)
+ public Like (IExpression e, IExpression pattern) : base (e)
{
- string original = pattern;
- int len = pattern.Length;
- openStart = (pattern[0] == '*' || pattern[0] == '%');
- openEnd = (pattern[len - 1] == '*' || pattern[len - 1]
== '%');
-
- pattern = pattern.Trim ('*', '%');
- pattern = pattern.Replace ("[*]", "[[0]]");
- pattern = pattern.Replace ("[%]", "[[1]]");
- if (pattern.IndexOf('*') != -1 || pattern.IndexOf('%')
!= -1)
- throw new EvaluateException (String.Format
("Pattern '{0}' is invalid.", original));
- pattern = pattern.Replace ("[[0]]", "*");
- pattern = pattern.Replace ("[[1]]", "%");
- pattern = pattern.Replace ("[[]", "[");
- pattern = pattern.Replace ("[]]", "]");
- this.pattern = pattern;
+ _pattern = pattern;
}
public override bool Equals(object obj)
@@ -67,15 +52,12 @@
return false;
Like other = (Like) obj;
- if (other.pattern != pattern)
- return false;
-
- return true;
+ return _pattern.Equals (other._pattern);
}
public override int GetHashCode()
{
- return pattern.GetHashCode () ^ base.GetHashCode ();
+ return _pattern.GetHashCode () ^ base.GetHashCode ();
}
override public object Eval (DataRow row)
@@ -84,7 +66,23 @@
if (o == DBNull.Value)
return o;
string str = (string)o;
- string pattern = this.pattern;
+ bool openStart, openEnd;
+ string pattern = (string) _pattern.Eval (row);
+ string original = pattern;
+ int len = pattern.Length;
+ openStart = (pattern [0] == '*' || pattern [0] == '%');
+ openEnd = (pattern [len - 1] == '*' || pattern [len -
1] == '%');
+
+ pattern = pattern.Trim ('*', '%');
+ pattern = pattern.Replace ("[*]", "[[0]]");
+ pattern = pattern.Replace ("[%]", "[[1]]");
+ if (pattern.IndexOf ('*') != -1 || pattern.IndexOf
('%') != -1)
+ throw new EvaluateException (String.Format
("Pattern '{0}' is invalid.", original));
+ pattern = pattern.Replace ("[[0]]", "*");
+ pattern = pattern.Replace ("[[1]]", "%");
+ pattern = pattern.Replace ("[[]", "[");
+ pattern = pattern.Replace ("[]]", "]");
+
if (!row.Table.CaseSensitive) {
str = str.ToLower();
pattern = pattern.ToLower();
Modified: trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/Parser.jay
2007-12-24 12:59:33 UTC (rev 91856)
@@ -271,8 +271,12 @@
;
StringExpr
- : SingleColumnValue
- | StringLiteral
+ : PAROPEN StringExpr PARCLOSE
+ {
+ $$ = (IExpression)$2;
+ }
+ | SingleColumnValue
+ | StringLiteral { $$ = new Literal ($1); }
| StringFunction
;
@@ -285,6 +289,10 @@
{
$$ = new SubstringFunction ((IExpression)$3, (IExpression)$5,
(IExpression)$7);
}
+ | StringExpr PLUS StringExpr
+ {
+ $$ = new ConcatFunction ((IExpression)$1, (IExpression)$3);
+ }
;
CalcFunction
@@ -312,33 +320,33 @@
;
IsPredicate
- : SingleColumnValue IS NULL
+ : ArithExpr IS NULL
{
$$ = new Comparison (Operation.EQ, (IExpression)$1, new Literal
(null));
}
- | SingleColumnValue IS NOT NULL
+ | ArithExpr IS NOT NULL
{
$$ = new Comparison (Operation.NE, (IExpression)$1, new Literal
(null));
}
;
LikePredicate
- : ArithExpr LIKE StringLiteral
+ : StringExpr LIKE StringExpr
{
- $$ = new Like ((IExpression)$1, (string)$3);
+ $$ = new Like ((IExpression)$1, (IExpression)$3);
}
- | ArithExpr NOT LIKE StringLiteral
+ | StringExpr NOT LIKE StringExpr
{
- $$ = new Negation (new Like ((IExpression)$1, (string)$4));
+ $$ = new Negation (new Like ((IExpression)$1, (IExpression)$4));
}
;
InPredicate
- : SingleColumnValue IN InPredicateValue
+ : ArithExpr IN InPredicateValue
{
$$ = new In ((IExpression)$1, (IList)$3);
}
- | SingleColumnValue NOT IN InPredicateValue
+ | ArithExpr NOT IN InPredicateValue
{
$$ = new Negation (new In ((IExpression)$1, (IList)$4));
}
Modified:
trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
===================================================================
--- trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
2007-12-24 12:16:09 UTC (rev 91855)
+++ trunk/mcs/class/System.Data/Mono.Data.SqlExpressions/StringFunctions.cs
2007-12-24 12:59:33 UTC (rev 91856)
@@ -54,6 +54,42 @@
return val;
}
}
+
+ internal class ConcatFunction : StringFunction
+ {
+ readonly IExpression _add;
+ public ConcatFunction (IExpression e, IExpression add)
+ : base (e)
+ {
+ _add = add;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!base.Equals (obj))
+ return false;
+
+ if (!(obj is ConcatFunction))
+ return false;
+
+ ConcatFunction other = (ConcatFunction) obj;
+ return _add.Equals (other._add);
+ }
+
+ public override int GetHashCode()
+ {
+ int hashCode = base.GetHashCode ();
+ hashCode ^= _add.GetHashCode ();
+ return hashCode;
+ }
+
+ override public object Eval (DataRow row) {
+ string str = (string) base.Eval (row);
+ string x = (string) _add.Eval (row);
+
+ return str + x;
+ }
+ }
internal class SubstringFunction : StringFunction {
IExpression start;
Modified:
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
===================================================================
---
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
2007-12-24 12:16:09 UTC (rev 91855)
+++
trunk/mcs/class/System.Data/Test/Mono.Data.SqlExpressions/DataColumnExpressionTest.cs
2007-12-24 12:59:33 UTC (rev 91856)
@@ -72,14 +72,37 @@
{
DataTable table = new DataTable ();
table.Columns.Add ("Col_0", Type.GetType
("System.String"));
- table.Columns.Add ("Result", Type.GetType
("System.String"), "SUBSTRING(Col_0, 2+2, 2)");
+ table.Columns.Add ("Result", Type.GetType
("System.String"), "SUBSTRING(Col_0+'K?', 2+2, 2)");
DataRow row = table.NewRow ();
- row ["Col_0"] = "Is OK?";
+ row ["Col_0"] = "Is O";
table.Rows.Add (row);
Assert.AreEqual ("OK", (string)table.Rows[0][1], "#1");
}
+ [Test]
+ public void TestConcat ()
+ {
+ DataTable table = new DataTable ();
+ table.Columns.Add ("Result", Type.GetType
("System.Int32"), "'3' + '2'");
+
+ DataRow row = table.NewRow ();
+
+ table.Rows.Add (row);
+ Assert.AreEqual (32, table.Rows[0][0], "#1");
+ }
+
+ [Test]
+ public void TestIsNull ()
+ {
+ DataTable table = new DataTable ();
+ table.Columns.Add ("Result", typeof(bool), "('3') IS
NULL");
+
+ DataRow row = table.NewRow ();
+
+ table.Rows.Add (row);
+ Assert.AreEqual (false, table.Rows[0][0], "#1");
+ }
}
[TestFixture]
public class DataColumnCharTest
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches