annotate Source/Data/Sql/SqlProvider/OracleSqlProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 namespace BLToolkit.Data.Sql.SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class OracleSqlProvider : BasicSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public override bool IsCountSubQuerySupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public override bool IsIdentityParameterRequired { get { return true; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public override int MaxInListValuesCount { get { return 1000; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 protected override void BuildSelectClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 if (SqlQuery.From.Tables.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 AppendIndent(sb).Append("SELECT").AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 BuildColumns(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 AppendIndent(sb).Append("FROM SYS.DUAL").AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 base.BuildSelectClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 protected override void BuildGetIdentity(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 var identityField = SqlQuery.Insert.Into.GetIdentityField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 if (identityField == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 throw new SqlException("Identity field must be defined for '{0}'.", SqlQuery.Insert.Into.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 AppendIndent(sb).AppendLine("RETURNING");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 AppendIndent(sb).Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 BuildExpression(sb, identityField, false, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 sb.AppendLine(" INTO :IDENTITY_PARAMETER");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 if (table.SequenceAttributes != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 var attr = GetSequenceNameAttribute(table, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 if (attr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 return new SqlExpression(attr.SequenceName + ".nextval", Precedence.Primary);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 return base.GetIdentityExpression(table, identityField, forReturning);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 protected override bool BuildWhere()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 return base.BuildWhere() || !NeedSkip && NeedTake && SqlQuery.OrderBy.IsEmpty && SqlQuery.Having.IsEmpty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 string _rowNumberAlias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 return new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 protected override void BuildSql(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 var buildRowNum = NeedSkip || NeedTake && (!SqlQuery.OrderBy.IsEmpty || !SqlQuery.Having.IsEmpty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 var aliases = null as string[];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 if (buildRowNum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 aliases = GetTempAliases(2, "t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 if (_rowNumberAlias == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 _rowNumberAlias = GetTempAliases(1, "rn")[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 AppendIndent(sb).AppendFormat("SELECT {0}.*", aliases[1]).AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 AppendIndent(sb).Append("FROM"). AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 AppendIndent(sb).Append("("). AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 Indent++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 AppendIndent(sb).AppendFormat("SELECT {0}.*, ROWNUM as {1}", aliases[0], _rowNumberAlias).AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 AppendIndent(sb).Append("FROM"). AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 AppendIndent(sb).Append("("). AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 Indent++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 base.BuildSql(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 if (buildRowNum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 Indent--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 AppendIndent(sb).Append(") ").Append(aliases[0]).AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 if (NeedTake && NeedSkip)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 AppendIndent(sb).AppendLine("WHERE");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 AppendIndent(sb).Append("\tROWNUM <= ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 BuildExpression(sb, Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 Indent--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 AppendIndent(sb).Append(") ").Append(aliases[1]).AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 AppendIndent(sb).Append("WHERE").AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 Indent++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 if (NeedTake && NeedSkip)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 AppendIndent(sb).AppendFormat("{0}.{1} > ", aliases[1], _rowNumberAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 BuildExpression(sb, SqlQuery.Select.SkipValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 else if (NeedTake)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 AppendIndent(sb).AppendFormat("{0}.{1} <= ", aliases[1], _rowNumberAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 BuildExpression(sb, Precedence.Comparison, SqlQuery.Select.TakeValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 AppendIndent(sb).AppendFormat("{0}.{1} > ", aliases[1], _rowNumberAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 BuildExpression(sb, Precedence.Comparison, SqlQuery.Select.SkipValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 Indent--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 protected override void BuildWhereSearchCondition(StringBuilder sb, SqlQuery.SearchCondition condition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 if (NeedTake && !NeedSkip && SqlQuery.OrderBy.IsEmpty && SqlQuery.Having.IsEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 BuildPredicate(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 sb,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 Precedence.LogicalConjunction,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 new SqlQuery.Predicate.ExprExpr(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 new SqlExpression(null, "ROWNUM", Precedence.Primary),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 SqlQuery.Predicate.Operator.LessOrEqual,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 SqlQuery.Select.TakeValue));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 if (base.BuildWhere())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 sb.Append(" AND ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 BuildSearchCondition(sb, Precedence.LogicalConjunction, condition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 BuildSearchCondition(sb, Precedence.Unknown, condition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 public override ISqlExpression ConvertExpression(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 expr = base.ConvertExpression(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var be = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 switch (be.Operation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 case "%": return new SqlFunction(be.SystemType, "MOD", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 case "&": return new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 case "|": // (a + b) - BITAND(a, b)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 return Sub(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 Add(be.Expr1, be.Expr2, be.SystemType),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 be.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 case "^": // (a + b) - BITAND(a, b) * 2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 return Sub(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 Add(be.Expr1, be.Expr2, be.SystemType),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 Mul(new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2), 2),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 be.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 var func = (SqlFunction) expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 case "Coalesce" : return new SqlFunction(func.SystemType, "Nvl", func.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 var ftype = TypeHelper.GetUnderlyingType(func.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 if (ftype == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 var ex = AlternativeConvertToBoolean(func, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 if (ex != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 return ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 if (ftype == typeof(DateTime) || ftype == typeof(DateTimeOffset))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 if (IsTimeDataType(func.Parameters[0]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 if (func.Parameters[1].SystemType == typeof(string))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 return func.Parameters[1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 return new SqlFunction(func.SystemType, "To_Char", func.Parameters[1], new SqlValue("HH24:MI:SS"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 if (TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType) == typeof(DateTime) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 IsDateDataType(func.Parameters[0], "Date"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 return new SqlFunction(func.SystemType, "Trunc", func.Parameters[1], new SqlValue("DD"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 return new SqlFunction(func.SystemType, "To_Timestamp", func.Parameters[1], new SqlValue("YYYY-MM-DD HH24:MI:SS"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 case "ContainsExactly":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 return func.Parameters.Length == 2 ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 new SqlFunction(func.SystemType, "Contains", func.Parameters[1], func.Parameters[0]) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 new SqlFunction(func.SystemType, "Contains", func.Parameters[1], func.Parameters[0], func.Parameters[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 case "CharIndex" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 return func.Parameters.Length == 2?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 new SqlFunction(func.SystemType, "InStr", func.Parameters[1], func.Parameters[0]):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 new SqlFunction(func.SystemType, "InStr", func.Parameters[1], func.Parameters[0], func.Parameters[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 case "AddYear" : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0], Mul(func.Parameters[1], 12));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 case "AddQuarter" : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0], Mul(func.Parameters[1], 3));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 case "AddMonth" : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 case "AddDayOfYear" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 case "AddWeekDay" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 case "AddDay" : return Add<DateTime>(func.Parameters[0], func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 case "AddWeek" : return Add<DateTime>(func.Parameters[0], Mul(func.Parameters[1], 7));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 case "AddHour" : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1], 24));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 case "AddMinute" : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1], 60 * 24));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 case "AddSecond" : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1], 60 * 60 * 24));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 case "AddMillisecond" : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1], 1000 * 60 * 60 * 24));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 case "Avg" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 return new SqlFunction(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 func.SystemType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 "Round",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 new SqlFunction(func.SystemType, "AVG", func.Parameters[0]),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 new SqlValue(27));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 else if (expr is SqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 var e = (SqlExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 if (e.Expr.StartsWith("To_Number(To_Char(") && e.Expr.EndsWith(", 'FF'))"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 return Div(new SqlExpression(e.SystemType, e.Expr.Replace("To_Number(To_Char(", "to_Number(To_Char("), e.Parameters), 1000);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 protected override void BuildFunction(StringBuilder sb, SqlFunction func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 func = ConvertFunctionParameters(func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 base.BuildFunction(sb, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 protected override void BuildDataType(StringBuilder sb, SqlDataType type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 switch (type.SqlDbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 case SqlDbType.BigInt : sb.Append("Number(19)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 case SqlDbType.TinyInt : sb.Append("Number(3)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 case SqlDbType.Money : sb.Append("Number(19,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 case SqlDbType.SmallMoney : sb.Append("Number(10,4)"); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 case SqlDbType.NVarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 sb.Append("VarChar2");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 if (type.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 sb.Append('(').Append(type.Length).Append(')');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 default : base.BuildDataType(sb, type); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 public override SqlQuery Finalize(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 CheckAliases(sqlQuery, 30);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 new QueryVisitor().Visit(sqlQuery.Select, element =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 if (element.ElementType == QueryElementType.SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 ((SqlParameter)element).IsQueryParameter = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 sqlQuery = base.Finalize(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 switch (sqlQuery.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 default : return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 public override void BuildValue(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 if (value is Guid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 var s = ((Guid)value).ToString("N");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 .Append("Cast('")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 .Append(s.Substring( 6, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 .Append(s.Substring( 4, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 .Append(s.Substring( 2, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 .Append(s.Substring( 0, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 .Append(s.Substring(10, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 .Append(s.Substring( 8, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 .Append(s.Substring(14, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 .Append(s.Substring(12, 2))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 .Append(s.Substring(16, 16))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 .Append("' as raw(16))");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 else if (value is DateTime)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 sb.AppendFormat("TO_TIMESTAMP('{0:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF7')", value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 base.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 var wrap = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 if (expr.SystemType == typeof(bool))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 if (expr is SqlQuery.SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 wrap = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 var ex = expr as SqlExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 if (wrap) sb.Append("CASE WHEN ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 base.BuildColumnExpression(sb, expr, alias, ref addAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 if (wrap) sb.Append(" THEN 1 ELSE 0 END");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 return ":" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 BuildInsertOrUpdateQueryAsMerge(sb, "FROM SYS.DUAL");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 protected override void BuildEmptyInsert(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 sb.Append("VALUES ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 foreach (var col in SqlQuery.Insert.Into.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 sb.Append("(DEFAULT)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 }