SqlNode.cs 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.Text;
  5. using System.Linq.Expressions;
  6. using System.Diagnostics;
  7. using System.Data;
  8. namespace System.Data.Linq.SqlClient {
  9. using System.Data.Linq.Mapping;
  10. using System.Data.Linq.Provider;
  11. using System.Diagnostics.CodeAnalysis;
  12. internal enum SqlNodeType {
  13. Add,
  14. Alias,
  15. AliasRef,
  16. And,
  17. Assign,
  18. Avg,
  19. Between,
  20. BitAnd,
  21. BitNot,
  22. BitOr,
  23. BitXor,
  24. Block,
  25. ClientArray,
  26. ClientCase,
  27. ClientParameter,
  28. ClientQuery,
  29. ClrLength,
  30. Coalesce,
  31. Column,
  32. ColumnRef,
  33. Concat,
  34. Convert,
  35. Count,
  36. Delete,
  37. DiscriminatedType,
  38. DiscriminatorOf,
  39. Div,
  40. DoNotVisit,
  41. Element,
  42. ExprSet,
  43. EQ,
  44. EQ2V,
  45. Exists,
  46. FunctionCall,
  47. In,
  48. IncludeScope,
  49. IsNotNull,
  50. IsNull,
  51. LE,
  52. Lift,
  53. Link,
  54. Like,
  55. LongCount,
  56. LT,
  57. GE,
  58. Grouping,
  59. GT,
  60. Insert,
  61. Join,
  62. JoinedCollection,
  63. Max,
  64. MethodCall,
  65. Member,
  66. MemberAssign,
  67. Min,
  68. Mod,
  69. Mul,
  70. Multiset,
  71. NE,
  72. NE2V,
  73. Negate,
  74. New,
  75. Not,
  76. Not2V,
  77. Nop,
  78. Or,
  79. OptionalValue,
  80. OuterJoinedValue,
  81. Parameter,
  82. Property,
  83. Row,
  84. RowNumber,
  85. ScalarSubSelect,
  86. SearchedCase,
  87. Select,
  88. SharedExpression,
  89. SharedExpressionRef,
  90. SimpleCase,
  91. SimpleExpression,
  92. Stddev,
  93. StoredProcedureCall,
  94. Sub,
  95. Sum,
  96. Table,
  97. TableValuedFunctionCall,
  98. Treat,
  99. TypeCase,
  100. Union,
  101. Update,
  102. UserColumn,
  103. UserQuery,
  104. UserRow,
  105. Variable,
  106. Value,
  107. ValueOf
  108. }
  109. [System.Diagnostics.DebuggerDisplay("text = {Text}, \r\nsource = {SourceExpression}")]
  110. internal abstract class SqlNode {
  111. private SqlNodeType nodeType;
  112. private Expression sourceExpression;
  113. internal SqlNode(SqlNodeType nodeType, Expression sourceExpression) {
  114. this.nodeType = nodeType;
  115. this.sourceExpression = sourceExpression;
  116. }
  117. internal Expression SourceExpression {
  118. get { return this.sourceExpression; }
  119. }
  120. internal void ClearSourceExpression() {
  121. this.sourceExpression = null;
  122. }
  123. internal SqlNodeType NodeType {
  124. get { return this.nodeType; }
  125. }
  126. #if DEBUG
  127. private static DbFormatter formatter;
  128. internal static DbFormatter Formatter {
  129. get { return formatter; }
  130. set { formatter = value; }
  131. }
  132. internal string Text {
  133. get {
  134. if (Formatter == null)
  135. return "SqlNode.Formatter is not assigned";
  136. return SqlNode.Formatter.Format(this, true);
  137. }
  138. }
  139. #endif
  140. }
  141. internal abstract class SqlExpression : SqlNode {
  142. private Type clrType;
  143. internal SqlExpression(SqlNodeType nodeType, Type clrType, Expression sourceExpression)
  144. : base(nodeType, sourceExpression) {
  145. this.clrType = clrType;
  146. }
  147. internal Type ClrType {
  148. get { return this.clrType; }
  149. }
  150. // note: changing the CLR type of a node is potentially dangerous
  151. internal void SetClrType(Type type) {
  152. this.clrType = type;
  153. }
  154. internal abstract ProviderType SqlType { get; }
  155. /// <summary>
  156. /// Drill down looking for a constant root expression, returning true if found.
  157. /// </summary>
  158. internal bool IsConstantColumn {
  159. get {
  160. if (this.NodeType == SqlNodeType.Column) {
  161. SqlColumn col = (SqlColumn)this;
  162. if (col.Expression != null) {
  163. return col.Expression.IsConstantColumn;
  164. }
  165. }
  166. else if (this.NodeType == SqlNodeType.ColumnRef) {
  167. return ((SqlColumnRef)this).Column.IsConstantColumn;
  168. }
  169. else if (this.NodeType == SqlNodeType.OptionalValue) {
  170. return ((SqlOptionalValue)this).Value.IsConstantColumn;
  171. }
  172. else if (this.NodeType == SqlNodeType.Value ||
  173. this.NodeType == SqlNodeType.Parameter) {
  174. return true;
  175. }
  176. return false;
  177. }
  178. }
  179. }
  180. /// <summary>
  181. /// A SqlExpression with a simple implementation of ClrType and SqlType.
  182. /// </summary>
  183. internal abstract class SqlSimpleTypeExpression : SqlExpression {
  184. private ProviderType sqlType;
  185. internal SqlSimpleTypeExpression(SqlNodeType nodeType, Type clrType, ProviderType sqlType, Expression sourceExpression)
  186. : base(nodeType, clrType, sourceExpression) {
  187. this.sqlType = sqlType;
  188. }
  189. internal override ProviderType SqlType {
  190. get { return this.sqlType; }
  191. }
  192. internal void SetSqlType(ProviderType type) {
  193. this.sqlType = type;
  194. }
  195. }
  196. internal class SqlDiscriminatorOf : SqlSimpleTypeExpression {
  197. SqlExpression obj;
  198. internal SqlDiscriminatorOf(SqlExpression obj, Type clrType, ProviderType sqlType, Expression sourceExpression)
  199. : base(SqlNodeType.DiscriminatorOf, clrType, sqlType, sourceExpression) {
  200. this.obj = obj;
  201. }
  202. internal SqlExpression Object {
  203. get { return this.obj; }
  204. set { this.obj = value; }
  205. }
  206. }
  207. /// <summary>
  208. /// Represents a dynamic CLR type that is chosen based on a discriminator expression.
  209. /// </summary>
  210. internal class SqlDiscriminatedType : SqlExpression {
  211. private ProviderType sqlType;
  212. private SqlExpression discriminator;
  213. private MetaType targetType;
  214. internal SqlDiscriminatedType(ProviderType sqlType, SqlExpression discriminator, MetaType targetType, Expression sourceExpression)
  215. : base(SqlNodeType.DiscriminatedType,
  216. typeof(Type),
  217. sourceExpression) {
  218. if (discriminator == null)
  219. throw Error.ArgumentNull("discriminator");
  220. this.discriminator = discriminator;
  221. this.targetType = targetType;
  222. this.sqlType = sqlType;
  223. }
  224. internal override ProviderType SqlType {
  225. get { return this.sqlType; }
  226. }
  227. internal SqlExpression Discriminator {
  228. get { return this.discriminator; }
  229. set { this.discriminator = value; }
  230. }
  231. internal MetaType TargetType {
  232. get { return this.targetType; }
  233. }
  234. }
  235. internal abstract class SqlStatement : SqlNode {
  236. internal SqlStatement(SqlNodeType nodeType, Expression sourceExpression)
  237. : base(nodeType, sourceExpression) {
  238. }
  239. }
  240. internal abstract class SqlSource : SqlNode {
  241. internal SqlSource(SqlNodeType nt, Expression sourceExpression)
  242. : base(nt, sourceExpression) {
  243. }
  244. }
  245. internal class SqlSelect : SqlStatement {
  246. private SqlExpression top;
  247. private bool isPercent;
  248. private bool isDistinct;
  249. private SqlExpression selection;
  250. private SqlRow row;
  251. private SqlSource from;
  252. private SqlExpression where;
  253. private List<SqlExpression> groupBy;
  254. private SqlExpression having;
  255. private List<SqlOrderExpression> orderBy;
  256. private SqlOrderingType orderingType;
  257. private bool squelch;
  258. internal SqlSelect(SqlExpression selection, SqlSource from, Expression sourceExpression)
  259. : base(SqlNodeType.Select, sourceExpression) {
  260. this.Row = new SqlRow(sourceExpression);
  261. this.Selection = selection;
  262. this.From = from;
  263. this.groupBy = new List<SqlExpression>();
  264. this.orderBy = new List<SqlOrderExpression>();
  265. this.orderingType = SqlOrderingType.Default;
  266. }
  267. internal SqlExpression Top {
  268. get { return this.top; }
  269. set { this.top = value; }
  270. }
  271. internal bool IsPercent {
  272. get { return this.isPercent; }
  273. set { this.isPercent = value; }
  274. }
  275. internal bool IsDistinct {
  276. get { return this.isDistinct; }
  277. set { this.isDistinct = value; }
  278. }
  279. internal SqlExpression Selection {
  280. get { return this.selection; }
  281. set {
  282. if (value == null)
  283. throw Error.ArgumentNull("value");
  284. this.selection = value;
  285. }
  286. }
  287. internal SqlRow Row {
  288. get { return this.row; }
  289. set {
  290. if (value == null)
  291. throw Error.ArgumentNull("value");
  292. this.row = value;
  293. }
  294. }
  295. internal SqlSource From {
  296. get { return this.from; }
  297. set { this.from = value; }
  298. }
  299. internal SqlExpression Where {
  300. get { return this.where; }
  301. set {
  302. if (value != null && TypeSystem.GetNonNullableType(value.ClrType) != typeof(bool)) {
  303. throw Error.ArgumentWrongType("value", "bool", value.ClrType);
  304. }
  305. this.where = value;
  306. }
  307. }
  308. internal List<SqlExpression> GroupBy {
  309. get { return this.groupBy; }
  310. }
  311. internal SqlExpression Having {
  312. get { return this.having; }
  313. set {
  314. if (value != null && TypeSystem.GetNonNullableType(value.ClrType) != typeof(bool)) {
  315. throw Error.ArgumentWrongType("value", "bool", value.ClrType);
  316. }
  317. this.having = value;
  318. }
  319. }
  320. internal List<SqlOrderExpression> OrderBy {
  321. get { return this.orderBy; }
  322. }
  323. internal SqlOrderingType OrderingType {
  324. get { return this.orderingType; }
  325. set { this.orderingType = value; }
  326. }
  327. internal bool DoNotOutput {
  328. get { return this.squelch; }
  329. set { this.squelch = value; }
  330. }
  331. }
  332. internal enum SqlOrderingType {
  333. Default,
  334. Never,
  335. Blocked,
  336. Always
  337. }
  338. internal class SqlTable : SqlNode {
  339. private MetaTable table;
  340. private MetaType rowType;
  341. private ProviderType sqlRowType;
  342. private List<SqlColumn> columns;
  343. internal SqlTable(MetaTable table, MetaType rowType, ProviderType sqlRowType, Expression sourceExpression)
  344. : base(SqlNodeType.Table, sourceExpression) {
  345. this.table = table;
  346. this.rowType = rowType;
  347. this.sqlRowType = sqlRowType;
  348. this.columns = new List<SqlColumn>();
  349. }
  350. internal MetaTable MetaTable {
  351. get { return this.table; }
  352. }
  353. internal string Name {
  354. get { return this.table.TableName; }
  355. }
  356. internal List<SqlColumn> Columns {
  357. get { return this.columns; }
  358. }
  359. internal MetaType RowType {
  360. get { return this.rowType; }
  361. }
  362. internal ProviderType SqlRowType {
  363. get { return this.sqlRowType; }
  364. }
  365. internal SqlColumn Find(string columnName) {
  366. foreach (SqlColumn c in this.Columns) {
  367. if (c.Name == columnName)
  368. return c;
  369. }
  370. return null;
  371. }
  372. }
  373. internal class SqlUserQuery : SqlNode {
  374. private string queryText;
  375. private SqlExpression projection;
  376. private List<SqlExpression> args;
  377. private List<SqlUserColumn> columns;
  378. internal SqlUserQuery(SqlNodeType nt, SqlExpression projection, IEnumerable<SqlExpression> args, Expression source)
  379. : base(nt, source) {
  380. this.Projection = projection;
  381. this.args = (args != null) ? new List<SqlExpression>(args) : new List<SqlExpression>();
  382. this.columns = new List<SqlUserColumn>();
  383. }
  384. internal SqlUserQuery(string queryText, SqlExpression projection, IEnumerable<SqlExpression> args, Expression source)
  385. : base(SqlNodeType.UserQuery, source) {
  386. this.queryText = queryText;
  387. this.Projection = projection;
  388. this.args = (args != null) ? new List<SqlExpression>(args) : new List<SqlExpression>();
  389. this.columns = new List<SqlUserColumn>();
  390. }
  391. internal string QueryText {
  392. get { return this.queryText; }
  393. }
  394. internal SqlExpression Projection {
  395. get { return this.projection; }
  396. set {
  397. if (this.projection != null && this.projection.ClrType != value.ClrType)
  398. throw Error.ArgumentWrongType("value", this.projection.ClrType, value.ClrType);
  399. this.projection = value;
  400. }
  401. }
  402. internal List<SqlExpression> Arguments {
  403. get { return this.args; }
  404. }
  405. internal List<SqlUserColumn> Columns {
  406. get { return this.columns; }
  407. }
  408. internal SqlUserColumn Find(string name) {
  409. foreach (SqlUserColumn c in this.Columns) {
  410. if (c.Name == name)
  411. return c;
  412. }
  413. return null;
  414. }
  415. }
  416. internal class SqlStoredProcedureCall : SqlUserQuery {
  417. private MetaFunction function;
  418. internal SqlStoredProcedureCall(MetaFunction function, SqlExpression projection, IEnumerable<SqlExpression> args, Expression source)
  419. : base(SqlNodeType.StoredProcedureCall, projection, args, source) {
  420. if (function == null)
  421. throw Error.ArgumentNull("function");
  422. this.function = function;
  423. }
  424. internal MetaFunction Function {
  425. get { return this.function; }
  426. }
  427. }
  428. internal class SqlUserRow : SqlSimpleTypeExpression {
  429. private SqlUserQuery query;
  430. private MetaType rowType;
  431. internal SqlUserRow(MetaType rowType, ProviderType sqlType, SqlUserQuery query, Expression source)
  432. : base(SqlNodeType.UserRow, rowType.Type, sqlType, source) {
  433. this.Query = query;
  434. this.rowType = rowType;
  435. }
  436. internal MetaType RowType {
  437. get { return this.rowType; }
  438. }
  439. internal SqlUserQuery Query {
  440. get { return this.query; }
  441. set {
  442. if (value == null)
  443. throw Error.ArgumentNull("value");
  444. if (value.Projection != null && value.Projection.ClrType != this.ClrType)
  445. throw Error.ArgumentWrongType("value", this.ClrType, value.Projection.ClrType);
  446. this.query = value;
  447. }
  448. }
  449. }
  450. internal class SqlUserColumn : SqlSimpleTypeExpression {
  451. private SqlUserQuery query;
  452. private string name;
  453. private bool isRequired;
  454. internal SqlUserColumn(Type clrType, ProviderType sqlType, SqlUserQuery query, string name, bool isRequired, Expression source)
  455. : base(SqlNodeType.UserColumn, clrType, sqlType, source) {
  456. this.Query = query;
  457. this.name = name;
  458. this.isRequired = isRequired;
  459. }
  460. internal SqlUserQuery Query {
  461. get { return this.query; }
  462. set {
  463. if (value == null)
  464. throw Error.ArgumentNull("value");
  465. if (this.query != null && this.query != value)
  466. throw Error.ArgumentWrongValue("value");
  467. this.query = value;
  468. }
  469. }
  470. internal string Name {
  471. get { return this.name; }
  472. }
  473. internal bool IsRequired {
  474. get { return this.isRequired; }
  475. }
  476. }
  477. internal class SqlAlias : SqlSource {
  478. private string name;
  479. private SqlNode node;
  480. internal SqlAlias(SqlNode node)
  481. : base(SqlNodeType.Alias, node.SourceExpression) {
  482. this.Node = node;
  483. }
  484. internal string Name {
  485. get { return this.name; }
  486. set { this.name = value; }
  487. }
  488. internal SqlNode Node {
  489. get { return this.node; }
  490. set {
  491. if (value == null)
  492. throw Error.ArgumentNull("value");
  493. if (!(value is SqlExpression || value is SqlSelect || value is SqlTable || value is SqlUnion))
  494. throw Error.UnexpectedNode(value.NodeType);
  495. this.node = value;
  496. }
  497. }
  498. }
  499. internal class SqlAliasRef : SqlExpression {
  500. private SqlAlias alias;
  501. internal SqlAliasRef(SqlAlias alias)
  502. : base(SqlNodeType.AliasRef, GetClrType(alias.Node), alias.SourceExpression) {
  503. if (alias == null)
  504. throw Error.ArgumentNull("alias");
  505. this.alias = alias;
  506. }
  507. internal SqlAlias Alias {
  508. get { return this.alias; }
  509. }
  510. internal override ProviderType SqlType {
  511. get { return GetSqlType(this.alias.Node); }
  512. }
  513. private static Type GetClrType(SqlNode node) {
  514. SqlTableValuedFunctionCall tvf = node as SqlTableValuedFunctionCall;
  515. if (tvf != null)
  516. return tvf.RowType.Type;
  517. SqlExpression exp = node as SqlExpression;
  518. if (exp != null) {
  519. if (TypeSystem.IsSequenceType(exp.ClrType))
  520. return TypeSystem.GetElementType(exp.ClrType);
  521. return exp.ClrType;
  522. }
  523. SqlSelect sel = node as SqlSelect;
  524. if (sel != null)
  525. return sel.Selection.ClrType;
  526. SqlTable tab = node as SqlTable;
  527. if (tab != null)
  528. return tab.RowType.Type;
  529. SqlUnion su = node as SqlUnion;
  530. if (su != null)
  531. return su.GetClrType();
  532. throw Error.UnexpectedNode(node.NodeType);
  533. }
  534. private static ProviderType GetSqlType(SqlNode node) {
  535. SqlExpression exp = node as SqlExpression;
  536. if (exp != null)
  537. return exp.SqlType;
  538. SqlSelect sel = node as SqlSelect;
  539. if (sel != null)
  540. return sel.Selection.SqlType;
  541. SqlTable tab = node as SqlTable;
  542. if (tab != null)
  543. return tab.SqlRowType;
  544. SqlUnion su = node as SqlUnion;
  545. if (su != null)
  546. return su.GetSqlType();
  547. throw Error.UnexpectedNode(node.NodeType);
  548. }
  549. }
  550. internal class SqlJoin : SqlSource {
  551. private SqlJoinType joinType;
  552. private SqlSource left;
  553. private SqlSource right;
  554. private SqlExpression condition;
  555. internal SqlJoin(SqlJoinType type, SqlSource left, SqlSource right, SqlExpression cond, Expression sourceExpression)
  556. : base(SqlNodeType.Join, sourceExpression) {
  557. this.JoinType = type;
  558. this.Left = left;
  559. this.Right = right;
  560. this.Condition = cond;
  561. }
  562. internal SqlJoinType JoinType {
  563. get { return this.joinType; }
  564. set { this.joinType = value; }
  565. }
  566. internal SqlSource Left {
  567. get { return this.left; }
  568. set {
  569. if (value == null)
  570. throw Error.ArgumentNull("value");
  571. this.left = value;
  572. }
  573. }
  574. internal SqlSource Right {
  575. get { return this.right; }
  576. set {
  577. if (value == null)
  578. throw Error.ArgumentNull("value");
  579. this.right = value;
  580. }
  581. }
  582. internal SqlExpression Condition {
  583. get { return this.condition; }
  584. set { this.condition = value; }
  585. }
  586. }
  587. internal enum SqlJoinType {
  588. Cross,
  589. Inner,
  590. LeftOuter,
  591. CrossApply,
  592. OuterApply
  593. }
  594. internal class SqlUnion : SqlNode {
  595. private SqlNode left;
  596. private SqlNode right;
  597. private bool all;
  598. internal SqlUnion(SqlNode left, SqlNode right, bool all)
  599. : base(SqlNodeType.Union, right.SourceExpression) {
  600. this.Left = left;
  601. this.Right = right;
  602. this.All = all;
  603. }
  604. internal SqlNode Left {
  605. get { return this.left; }
  606. set {
  607. Validate(value);
  608. this.left = value;
  609. }
  610. }
  611. internal SqlNode Right {
  612. get { return this.right; }
  613. set {
  614. Validate(value);
  615. this.right = value;
  616. }
  617. }
  618. internal bool All {
  619. get { return this.all; }
  620. set { this.all = value; }
  621. }
  622. [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")]
  623. private void Validate(SqlNode node) {
  624. if (node == null)
  625. throw Error.ArgumentNull("node");
  626. if (!(node is SqlExpression || node is SqlSelect || node is SqlUnion))
  627. throw Error.UnexpectedNode(node.NodeType);
  628. }
  629. internal Type GetClrType() {
  630. SqlExpression exp = this.Left as SqlExpression;
  631. if (exp != null)
  632. return exp.ClrType;
  633. SqlSelect sel = this.Left as SqlSelect;
  634. if (sel != null)
  635. return sel.Selection.ClrType;
  636. throw Error.CouldNotGetClrType();
  637. }
  638. internal ProviderType GetSqlType() {
  639. SqlExpression exp = this.Left as SqlExpression;
  640. if (exp != null)
  641. return exp.SqlType;
  642. SqlSelect sel = this.Left as SqlSelect;
  643. if (sel != null)
  644. return sel.Selection.SqlType;
  645. throw Error.CouldNotGetSqlType();
  646. }
  647. }
  648. internal class SqlNop : SqlSimpleTypeExpression {
  649. internal SqlNop(Type clrType, ProviderType sqlType, Expression sourceExpression)
  650. : base(SqlNodeType.Nop, clrType, sqlType, sourceExpression) {
  651. }
  652. }
  653. internal class SqlLift : SqlExpression {
  654. internal SqlExpression liftedExpression;
  655. internal SqlLift(Type type, SqlExpression liftedExpression, Expression sourceExpression)
  656. : base(SqlNodeType.Lift, type, sourceExpression) {
  657. if (liftedExpression == null)
  658. throw Error.ArgumentNull("liftedExpression");
  659. this.liftedExpression = liftedExpression;
  660. }
  661. internal SqlExpression Expression {
  662. get { return this.liftedExpression; }
  663. set {
  664. if (value == null)
  665. throw Error.ArgumentNull("value");
  666. this.liftedExpression = value;
  667. }
  668. }
  669. internal override ProviderType SqlType {
  670. get { return this.liftedExpression.SqlType; }
  671. }
  672. }
  673. internal enum SqlOrderType {
  674. Ascending,
  675. Descending
  676. }
  677. internal class SqlOrderExpression : IEquatable<SqlOrderExpression> {
  678. private SqlOrderType orderType;
  679. private SqlExpression expression;
  680. internal SqlOrderExpression(SqlOrderType type, SqlExpression expr) {
  681. this.OrderType = type;
  682. this.Expression = expr;
  683. }
  684. internal SqlOrderType OrderType {
  685. get { return this.orderType; }
  686. set { this.orderType = value; }
  687. }
  688. internal SqlExpression Expression {
  689. get { return this.expression; }
  690. set {
  691. if (value == null)
  692. throw Error.ArgumentNull("value");
  693. if (this.expression != null && !this.expression.ClrType.IsAssignableFrom(value.ClrType))
  694. throw Error.ArgumentWrongType("value", this.expression.ClrType, value.ClrType);
  695. this.expression = value;
  696. }
  697. }
  698. public override bool Equals(object obj) {
  699. if (this.EqualsTo(obj as SqlOrderExpression))
  700. return true;
  701. return base.Equals(obj);
  702. }
  703. public bool Equals(SqlOrderExpression other) {
  704. if (this.EqualsTo(other))
  705. return true;
  706. return base.Equals(other);
  707. }
  708. private bool EqualsTo(SqlOrderExpression other) {
  709. if (other == null)
  710. return false;
  711. if (object.ReferenceEquals(this, other))
  712. return true;
  713. if (this.OrderType != other.OrderType)
  714. return false;
  715. if (!this.Expression.SqlType.Equals(other.Expression.SqlType))
  716. return false;
  717. SqlColumn col1 = SqlOrderExpression.UnwrapColumn(this.Expression);
  718. SqlColumn col2 = SqlOrderExpression.UnwrapColumn(other.Expression);
  719. if (col1 == null || col2 == null)
  720. return false;
  721. return col1 == col2;
  722. }
  723. public override int GetHashCode() {
  724. SqlColumn col = SqlOrderExpression.UnwrapColumn(this.Expression);
  725. if (col != null)
  726. return col.GetHashCode();
  727. return base.GetHashCode();
  728. }
  729. private static SqlColumn UnwrapColumn(SqlExpression expr) {
  730. System.Diagnostics.Debug.Assert(expr != null);
  731. SqlUnary exprAsUnary = expr as SqlUnary;
  732. if (exprAsUnary != null) {
  733. expr = exprAsUnary.Operand;
  734. }
  735. SqlColumn exprAsColumn = expr as SqlColumn;
  736. if (exprAsColumn != null) {
  737. return exprAsColumn;
  738. }
  739. SqlColumnRef exprAsColumnRef = expr as SqlColumnRef;
  740. if (exprAsColumnRef != null) {
  741. return exprAsColumnRef.GetRootColumn();
  742. }
  743. //
  744. // For all other types return null to revert to default behavior for Equals()
  745. // and GetHashCode()
  746. //
  747. return null;
  748. }
  749. }
  750. internal class SqlRowNumber : SqlSimpleTypeExpression {
  751. private List<SqlOrderExpression> orderBy;
  752. internal List<SqlOrderExpression> OrderBy {
  753. get { return orderBy; }
  754. }
  755. internal SqlRowNumber(Type clrType, ProviderType sqlType, List<SqlOrderExpression> orderByList, Expression sourceExpression)
  756. : base(SqlNodeType.RowNumber, clrType, sqlType, sourceExpression) {
  757. if (orderByList == null) {
  758. throw Error.ArgumentNull("orderByList");
  759. }
  760. this.orderBy = orderByList;
  761. }
  762. }
  763. internal class SqlUnary : SqlSimpleTypeExpression {
  764. private SqlExpression operand;
  765. private MethodInfo method;
  766. [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification="These issues are related to our use of if-then and case statements for node types, which adds to the complexity count however when reviewed they are easy to navigate and understand.")]
  767. internal SqlUnary(SqlNodeType nt, Type clrType, ProviderType sqlType, SqlExpression expr, Expression sourceExpression)
  768. : this(nt, clrType, sqlType, expr, null, sourceExpression) {
  769. }
  770. internal SqlUnary(SqlNodeType nt, Type clrType, ProviderType sqlType, SqlExpression expr, MethodInfo method, Expression sourceExpression)
  771. : base(nt, clrType, sqlType, sourceExpression) {
  772. switch (nt) {
  773. case SqlNodeType.Not:
  774. case SqlNodeType.Not2V:
  775. case SqlNodeType.Negate:
  776. case SqlNodeType.BitNot:
  777. case SqlNodeType.IsNull:
  778. case SqlNodeType.IsNotNull:
  779. case SqlNodeType.Count:
  780. case SqlNodeType.LongCount:
  781. case SqlNodeType.Max:
  782. case SqlNodeType.Min:
  783. case SqlNodeType.Sum:
  784. case SqlNodeType.Avg:
  785. case SqlNodeType.Stddev:
  786. case SqlNodeType.Convert:
  787. case SqlNodeType.ValueOf:
  788. case SqlNodeType.Treat:
  789. case SqlNodeType.OuterJoinedValue:
  790. case SqlNodeType.ClrLength:
  791. break;
  792. default:
  793. throw Error.UnexpectedNode(nt);
  794. }
  795. this.Operand = expr;
  796. this.method = method;
  797. }
  798. internal SqlExpression Operand {
  799. get { return this.operand; }
  800. set {
  801. if (value == null && (this.NodeType != SqlNodeType.Count && this.NodeType != SqlNodeType.LongCount))
  802. throw Error.ArgumentNull("value");
  803. this.operand = value;
  804. }
  805. }
  806. internal MethodInfo Method {
  807. get { return this.method; }
  808. }
  809. }
  810. internal class SqlBinary : SqlSimpleTypeExpression {
  811. private SqlExpression left;
  812. private SqlExpression right;
  813. private MethodInfo method;
  814. [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These issues are related to our use of if-then and case statements for node types, which adds to the complexity count however when reviewed they are easy to navigate and understand.")]
  815. internal SqlBinary(SqlNodeType nt, Type clrType, ProviderType sqlType, SqlExpression left, SqlExpression right)
  816. : this(nt, clrType, sqlType, left, right, null) {
  817. }
  818. internal SqlBinary(SqlNodeType nt, Type clrType, ProviderType sqlType, SqlExpression left, SqlExpression right, MethodInfo method)
  819. : base(nt, clrType, sqlType, right.SourceExpression) {
  820. switch (nt) {
  821. case SqlNodeType.Add:
  822. case SqlNodeType.Sub:
  823. case SqlNodeType.Mul:
  824. case SqlNodeType.Div:
  825. case SqlNodeType.Mod:
  826. case SqlNodeType.BitAnd:
  827. case SqlNodeType.BitOr:
  828. case SqlNodeType.BitXor:
  829. case SqlNodeType.And:
  830. case SqlNodeType.Or:
  831. case SqlNodeType.GE:
  832. case SqlNodeType.GT:
  833. case SqlNodeType.LE:
  834. case SqlNodeType.LT:
  835. case SqlNodeType.EQ:
  836. case SqlNodeType.NE:
  837. case SqlNodeType.EQ2V:
  838. case SqlNodeType.NE2V:
  839. case SqlNodeType.Concat:
  840. case SqlNodeType.Coalesce:
  841. break;
  842. default:
  843. throw Error.UnexpectedNode(nt);
  844. }
  845. this.Left = left;
  846. this.Right = right;
  847. this.method = method;
  848. }
  849. internal SqlExpression Left {
  850. get { return this.left; }
  851. set {
  852. if (value == null)
  853. throw Error.ArgumentNull("value");
  854. this.left = value;
  855. }
  856. }
  857. internal SqlExpression Right {
  858. get { return this.right; }
  859. set {
  860. if (value == null)
  861. throw Error.ArgumentNull("value");
  862. this.right = value;
  863. }
  864. }
  865. internal MethodInfo Method {
  866. get { return this.method; }
  867. }
  868. }
  869. internal class SqlBetween : SqlSimpleTypeExpression {
  870. SqlExpression expression;
  871. SqlExpression start;
  872. SqlExpression end;
  873. internal SqlBetween(Type clrType, ProviderType sqlType, SqlExpression expr, SqlExpression start, SqlExpression end, Expression source)
  874. : base(SqlNodeType.Between, clrType, sqlType, source) {
  875. this.expression = expr;
  876. this.start = start;
  877. this.end = end;
  878. }
  879. internal SqlExpression Expression {
  880. get { return this.expression; }
  881. set { this.expression = value; }
  882. }
  883. internal SqlExpression Start {
  884. get { return this.start; }
  885. set { this.start = value; }
  886. }
  887. internal SqlExpression End {
  888. get { return this.end; }
  889. set { this.end = value; }
  890. }
  891. }
  892. internal class SqlIn : SqlSimpleTypeExpression {
  893. private SqlExpression expression;
  894. private List<SqlExpression> values;
  895. internal SqlIn(Type clrType, ProviderType sqlType, SqlExpression expression, IEnumerable<SqlExpression> values, Expression sourceExpression)
  896. :base(SqlNodeType.In, clrType, sqlType, sourceExpression) {
  897. this.expression = expression;
  898. this.values = values != null ? new List<SqlExpression>(values) : new List<SqlExpression>(0);
  899. }
  900. internal SqlExpression Expression {
  901. get { return this.expression; }
  902. set {
  903. if (value == null) {
  904. throw Error.ArgumentNull("value");
  905. }
  906. this.expression = value;
  907. }
  908. }
  909. internal List<SqlExpression> Values {
  910. get { return this.values; }
  911. }
  912. }
  913. internal class SqlLike : SqlSimpleTypeExpression {
  914. private SqlExpression expression;
  915. private SqlExpression pattern;
  916. private SqlExpression escape;
  917. internal SqlLike(Type clrType, ProviderType sqlType, SqlExpression expr, SqlExpression pattern, SqlExpression escape, Expression source)
  918. : base(SqlNodeType.Like, clrType, sqlType, source) {
  919. if (expr == null)
  920. throw Error.ArgumentNull("expr");
  921. if (pattern == null)
  922. throw Error.ArgumentNull("pattern");
  923. this.Expression = expr;
  924. this.Pattern = pattern;
  925. this.Escape = escape;
  926. }
  927. internal SqlExpression Expression {
  928. get { return this.expression; }
  929. set {
  930. if (value == null)
  931. throw Error.ArgumentNull("value");
  932. if (value.ClrType != typeof(string))
  933. throw Error.ArgumentWrongType("value", "string", value.ClrType);
  934. this.expression = value;
  935. }
  936. }
  937. internal SqlExpression Pattern {
  938. get { return this.pattern; }
  939. set {
  940. if (value == null)
  941. throw Error.ArgumentNull("value");
  942. if (value.ClrType != typeof(string))
  943. throw Error.ArgumentWrongType("value", "string", value.ClrType);
  944. this.pattern = value;
  945. }
  946. }
  947. internal SqlExpression Escape {
  948. get { return this.escape; }
  949. set {
  950. if (value != null && value.ClrType != typeof(string))
  951. throw Error.ArgumentWrongType("value", "string", value.ClrType);
  952. this.escape = value;
  953. }
  954. }
  955. }
  956. internal class SqlWhen {
  957. private SqlExpression matchExpression;
  958. private SqlExpression valueExpression;
  959. internal SqlWhen(SqlExpression match, SqlExpression value) {
  960. // 'match' may be null when this when represents the ELSE condition.
  961. if (value == null)
  962. throw Error.ArgumentNull("value");
  963. this.Match = match;
  964. this.Value = value;
  965. }
  966. internal SqlExpression Match {
  967. get { return this.matchExpression; }
  968. set {
  969. if (this.matchExpression != null && value != null && this.matchExpression.ClrType != value.ClrType
  970. // Exception: bool types, because predicates can have type bool or bool?
  971. && !TypeSystem.GetNonNullableType(this.matchExpression.ClrType).Equals(typeof(bool))
  972. && !TypeSystem.GetNonNullableType(value.ClrType).Equals(typeof(bool)))
  973. throw Error.ArgumentWrongType("value", this.matchExpression.ClrType, value.ClrType);
  974. this.matchExpression = value;
  975. }
  976. }
  977. internal SqlExpression Value {
  978. get { return this.valueExpression; }
  979. set {
  980. if (value == null)
  981. throw Error.ArgumentNull("value");
  982. if (this.valueExpression != null && !this.valueExpression.ClrType.IsAssignableFrom(value.ClrType))
  983. throw Error.ArgumentWrongType("value", this.valueExpression.ClrType, value.ClrType);
  984. this.valueExpression = value;
  985. }
  986. }
  987. }
  988. /*
  989. * Searched CASE function:
  990. * CASE
  991. * WHEN BooleanExpression THEN resultExpression
  992. * [ ...n ]
  993. * [
  994. * ELSE elseResultExpression
  995. * ]
  996. * END
  997. */
  998. internal class SqlSearchedCase : SqlExpression {
  999. private List<SqlWhen> whens;
  1000. private SqlExpression @else;
  1001. internal SqlSearchedCase(Type clrType, IEnumerable<SqlWhen> whens, SqlExpression @else, Expression sourceExpression)
  1002. : base(SqlNodeType.SearchedCase, clrType, sourceExpression) {
  1003. if (whens == null)
  1004. throw Error.ArgumentNull("whens");
  1005. this.whens = new List<SqlWhen>(whens);
  1006. if (this.whens.Count == 0)
  1007. throw Error.ArgumentOutOfRange("whens");
  1008. this.Else = @else;
  1009. }
  1010. internal List<SqlWhen> Whens {
  1011. get { return this.whens; }
  1012. }
  1013. internal SqlExpression Else {
  1014. get { return this.@else; }
  1015. set {
  1016. if (value == null)
  1017. throw Error.ArgumentNull("value");
  1018. if (this.@else != null && [email protected](value.ClrType))
  1019. throw Error.ArgumentWrongType("value", [email protected], value.ClrType);
  1020. this.@else = value;
  1021. }
  1022. }
  1023. internal override ProviderType SqlType {
  1024. get { return this.whens[0].Value.SqlType; }
  1025. }
  1026. }
  1027. /*
  1028. * Simple CASE function:
  1029. * CASE inputExpression
  1030. * WHEN whenExpression THEN resultExpression
  1031. * [ ...n ]
  1032. * [
  1033. * ELSE elseResultExpression
  1034. * ]
  1035. * END
  1036. */
  1037. internal class SqlSimpleCase : SqlExpression {
  1038. private SqlExpression expression;
  1039. private List<SqlWhen> whens = new List<SqlWhen>();
  1040. internal SqlSimpleCase(Type clrType, SqlExpression expr, IEnumerable<SqlWhen> whens, Expression sourceExpression)
  1041. : base(SqlNodeType.SimpleCase, clrType, sourceExpression) {
  1042. this.Expression = expr;
  1043. if (whens == null)
  1044. throw Error.ArgumentNull("whens");
  1045. this.whens.AddRange(whens);
  1046. if (this.whens.Count == 0)
  1047. throw Error.ArgumentOutOfRange("whens");
  1048. }
  1049. internal SqlExpression Expression {
  1050. get { return this.expression; }
  1051. set {
  1052. if (value == null)
  1053. throw Error.ArgumentNull("value");
  1054. if (this.expression != null && this.expression.ClrType != value.ClrType)
  1055. throw Error.ArgumentWrongType("value", this.expression.ClrType, value.ClrType);
  1056. this.expression = value;
  1057. }
  1058. }
  1059. internal List<SqlWhen> Whens {
  1060. get { return this.whens; }
  1061. }
  1062. internal override ProviderType SqlType {
  1063. get { return this.whens[0].Value.SqlType; }
  1064. }
  1065. }
  1066. /// <summary>
  1067. /// A case statement that must be evaluated on the client. For example, a case statement
  1068. /// that contains values of LINK, Element, or Multi-set are not directly handleable by
  1069. /// SQL.
  1070. ///
  1071. /// CASE inputExpression
  1072. /// WHEN whenExpression THEN resultExpression
  1073. /// [ ...n ]
  1074. /// END
  1075. /// </summary>
  1076. internal class SqlClientCase : SqlExpression {
  1077. private SqlExpression expression;
  1078. private List<SqlClientWhen> whens = new List<SqlClientWhen>();
  1079. internal SqlClientCase(Type clrType, SqlExpression expr, IEnumerable<SqlClientWhen> whens, Expression sourceExpression)
  1080. : base(SqlNodeType.ClientCase, clrType, sourceExpression) {
  1081. this.Expression = expr;
  1082. if (whens == null)
  1083. throw Error.ArgumentNull("whens");
  1084. this.whens.AddRange(whens);
  1085. if (this.whens.Count == 0)
  1086. throw Error.ArgumentOutOfRange("whens");
  1087. }
  1088. internal SqlExpression Expression {
  1089. get { return this.expression; }
  1090. set {
  1091. if (value == null)
  1092. throw Error.ArgumentNull("value");
  1093. if (this.expression != null && this.expression.ClrType != value.ClrType)
  1094. throw Error.ArgumentWrongType("value", this.expression.ClrType, value.ClrType);
  1095. this.expression = value;
  1096. }
  1097. }
  1098. internal List<SqlClientWhen> Whens {
  1099. get { return this.whens; }
  1100. }
  1101. internal override ProviderType SqlType {
  1102. get { return this.whens[0].Value.SqlType; }
  1103. }
  1104. }
  1105. /// <summary>
  1106. /// A single WHEN clause for ClientCase.
  1107. /// </summary>
  1108. internal class SqlClientWhen {
  1109. private SqlExpression matchExpression;
  1110. private SqlExpression matchValue;
  1111. internal SqlClientWhen(SqlExpression match, SqlExpression value) {
  1112. // 'match' may be null when this when represents the ELSE condition.
  1113. if (value == null)
  1114. throw Error.ArgumentNull("value");
  1115. this.Match = match;
  1116. this.Value = value;
  1117. }
  1118. internal SqlExpression Match {
  1119. get { return this.matchExpression; }
  1120. set {
  1121. if (this.matchExpression != null && value != null && this.matchExpression.ClrType != value.ClrType)
  1122. throw Error.ArgumentWrongType("value", this.matchExpression.ClrType, value.ClrType);
  1123. this.matchExpression = value;
  1124. }
  1125. }
  1126. internal SqlExpression Value {
  1127. get { return this.matchValue; }
  1128. set {
  1129. if (value == null)
  1130. throw Error.ArgumentNull("value");
  1131. if (this.matchValue != null && this.matchValue.ClrType != value.ClrType)
  1132. throw Error.ArgumentWrongType("value", this.matchValue.ClrType, value.ClrType);
  1133. this.matchValue = value;
  1134. }
  1135. }
  1136. }
  1137. /// <summary>
  1138. /// Represents the construction of an object in abstract 'super sql'.
  1139. /// The type may be polymorphic. A discriminator field is used to determine
  1140. /// which type in a hierarchy should be instantiated.
  1141. /// In the common degenerate case where the inheritance hierarchy is 1-deep
  1142. /// the discriminator will be a constant SqlValue and there will be one
  1143. /// type-case-when corresponding to that type.
  1144. /// </summary>
  1145. internal class SqlTypeCase : SqlExpression {
  1146. private MetaType rowType;
  1147. private SqlExpression discriminator;
  1148. private List<SqlTypeCaseWhen> whens = new List<SqlTypeCaseWhen>();
  1149. ProviderType sqlType;
  1150. internal SqlTypeCase(Type clrType, ProviderType sqlType, MetaType rowType, SqlExpression discriminator, IEnumerable<SqlTypeCaseWhen> whens, Expression sourceExpression)
  1151. : base(SqlNodeType.TypeCase, clrType, sourceExpression) {
  1152. this.Discriminator = discriminator;
  1153. if (whens == null)
  1154. throw Error.ArgumentNull("whens");
  1155. this.whens.AddRange(whens);
  1156. if (this.whens.Count == 0)
  1157. throw Error.ArgumentOutOfRange("whens");
  1158. this.sqlType = sqlType;
  1159. this.rowType = rowType;
  1160. }
  1161. internal SqlExpression Discriminator {
  1162. get { return this.discriminator; }
  1163. set {
  1164. if (value == null)
  1165. throw Error.ArgumentNull("value");
  1166. if (this.discriminator != null && this.discriminator.ClrType != value.ClrType)
  1167. throw Error.ArgumentWrongType("value", this.discriminator.ClrType, value.ClrType);
  1168. this.discriminator = value;
  1169. }
  1170. }
  1171. internal List<SqlTypeCaseWhen> Whens {
  1172. get { return this.whens; }
  1173. }
  1174. internal override ProviderType SqlType {
  1175. get { return sqlType; }
  1176. }
  1177. internal MetaType RowType {
  1178. get { return this.rowType; }
  1179. }
  1180. }
  1181. /// <summary>
  1182. /// Represents one choice of object instantiation type in a type case.
  1183. /// When 'match' is the same as type case Discriminator then the corresponding
  1184. /// type binding is the one used for instantiation.
  1185. /// </summary>
  1186. internal class SqlTypeCaseWhen {
  1187. private SqlExpression match;
  1188. private SqlExpression @new;
  1189. internal SqlTypeCaseWhen(SqlExpression match, SqlExpression typeBinding) {
  1190. this.Match = match;
  1191. this.TypeBinding = typeBinding;
  1192. }
  1193. internal SqlExpression Match {
  1194. get { return this.match; }
  1195. set {
  1196. if (this.match != null && value != null && this.match.ClrType != value.ClrType)
  1197. throw Error.ArgumentWrongType("value", this.match.ClrType, value.ClrType);
  1198. this.match = value;
  1199. }
  1200. }
  1201. internal SqlExpression TypeBinding {
  1202. get { return this.@new; }
  1203. set { this.@new = value; }
  1204. }
  1205. }
  1206. internal class SqlValue : SqlSimpleTypeExpression {
  1207. private object value;
  1208. private bool isClient;
  1209. internal SqlValue(Type clrType, ProviderType sqlType, object value, bool isClientSpecified, Expression sourceExpression)
  1210. : base(SqlNodeType.Value, clrType, sqlType, sourceExpression) {
  1211. this.value = value;
  1212. this.isClient = isClientSpecified;
  1213. }
  1214. internal object Value {
  1215. get { return this.value; }
  1216. }
  1217. internal bool IsClientSpecified {
  1218. get { return this.isClient; }
  1219. }
  1220. }
  1221. internal class SqlParameter : SqlSimpleTypeExpression {
  1222. private string name;
  1223. private System.Data.ParameterDirection direction;
  1224. internal SqlParameter(Type clrType, ProviderType sqlType, string name, Expression sourceExpression)
  1225. : base(SqlNodeType.Parameter, clrType, sqlType, sourceExpression) {
  1226. if (name == null)
  1227. throw Error.ArgumentNull("name");
  1228. if (typeof(Type).IsAssignableFrom(clrType))
  1229. throw Error.ArgumentWrongValue("clrType");
  1230. this.name = name;
  1231. this.direction = System.Data.ParameterDirection.Input;
  1232. }
  1233. internal string Name {
  1234. get { return this.name; }
  1235. }
  1236. internal System.Data.ParameterDirection Direction {
  1237. get { return this.direction; }
  1238. set { this.direction = value; }
  1239. }
  1240. }
  1241. internal class SqlVariable : SqlSimpleTypeExpression {
  1242. private string name;
  1243. internal SqlVariable(Type clrType, ProviderType sqlType, string name, Expression sourceExpression)
  1244. : base(SqlNodeType.Variable, clrType, sqlType, sourceExpression) {
  1245. if (name == null)
  1246. throw Error.ArgumentNull("name");
  1247. this.name = name;
  1248. }
  1249. internal string Name {
  1250. get { return this.name; }
  1251. }
  1252. }
  1253. internal class SqlMember : SqlSimpleTypeExpression {
  1254. private SqlExpression expression;
  1255. private MemberInfo member;
  1256. internal SqlMember(Type clrType, ProviderType sqlType, SqlExpression expr, MemberInfo member)
  1257. : base(SqlNodeType.Member, clrType, sqlType, expr.SourceExpression) {
  1258. this.member = member;
  1259. this.Expression = expr;
  1260. }
  1261. internal MemberInfo Member {
  1262. get { return this.member; }
  1263. }
  1264. internal SqlExpression Expression {
  1265. get {
  1266. return this.expression;
  1267. }
  1268. set {
  1269. if (value == null)
  1270. throw Error.ArgumentNull("value");
  1271. if (!this.member.ReflectedType.IsAssignableFrom(value.ClrType) &&
  1272. !value.ClrType.IsAssignableFrom(this.member.ReflectedType))
  1273. throw Error.MemberAccessIllegal(this.member, this.member.ReflectedType, value.ClrType);
  1274. this.expression = value;
  1275. }
  1276. }
  1277. }
  1278. internal class SqlColumn : SqlExpression {
  1279. private SqlAlias alias;
  1280. private string name;
  1281. private int ordinal;
  1282. private MetaDataMember member;
  1283. private SqlExpression expression;
  1284. private ProviderType sqlType;
  1285. internal SqlColumn(Type clrType, ProviderType sqlType, string name, MetaDataMember member, SqlExpression expr, Expression sourceExpression)
  1286. : base(SqlNodeType.Column, clrType, sourceExpression) {
  1287. if (typeof(Type).IsAssignableFrom(clrType))
  1288. throw Error.ArgumentWrongValue("clrType");
  1289. this.Name = name;
  1290. this.member = member;
  1291. this.Expression = expr;
  1292. this.Ordinal = -1;
  1293. if (sqlType == null)
  1294. throw Error.ArgumentNull("sqlType");
  1295. this.sqlType = sqlType;
  1296. System.Diagnostics.Debug.Assert(sqlType.CanBeColumn);
  1297. }
  1298. internal SqlColumn(string name, SqlExpression expr)
  1299. : this(expr.ClrType, expr.SqlType, name, null, expr, expr.SourceExpression) {
  1300. System.Diagnostics.Debug.Assert(expr != null);
  1301. }
  1302. internal SqlAlias Alias {
  1303. get { return this.alias; }
  1304. set { this.alias = value; }
  1305. }
  1306. internal string Name {
  1307. get { return this.name; }
  1308. set { this.name = value; }
  1309. }
  1310. internal int Ordinal {
  1311. get { return this.ordinal; }
  1312. set { this.ordinal = value; }
  1313. }
  1314. internal MetaDataMember MetaMember {
  1315. get { return this.member; }
  1316. }
  1317. /// <summary>
  1318. /// Set the column's Expression. This can change the type of the column.
  1319. /// </summary>
  1320. internal SqlExpression Expression {
  1321. get {
  1322. return this.expression;
  1323. }
  1324. set {
  1325. if (value != null) {
  1326. if (!this.ClrType.IsAssignableFrom(value.ClrType))
  1327. throw Error.ArgumentWrongType("value", this.ClrType, value.ClrType);
  1328. SqlColumnRef cref = value as SqlColumnRef;
  1329. if (cref != null && cref.Column == this)
  1330. throw Error.ColumnCannotReferToItself();
  1331. }
  1332. this.expression = value;
  1333. }
  1334. }
  1335. internal override ProviderType SqlType {
  1336. get {
  1337. if (this.expression != null)
  1338. return this.expression.SqlType;
  1339. return this.sqlType;
  1340. }
  1341. }
  1342. }
  1343. internal class SqlColumnRef : SqlExpression {
  1344. private SqlColumn column;
  1345. internal SqlColumnRef(SqlColumn col)
  1346. : base(SqlNodeType.ColumnRef, col.ClrType, col.SourceExpression) {
  1347. this.column = col;
  1348. }
  1349. internal SqlColumn Column {
  1350. get { return this.column; }
  1351. }
  1352. internal override ProviderType SqlType {
  1353. get { return this.column.SqlType; }
  1354. }
  1355. public override bool Equals(object obj) {
  1356. SqlColumnRef cref = obj as SqlColumnRef;
  1357. return cref != null && cref.Column == this.column;
  1358. }
  1359. public override int GetHashCode() {
  1360. return this.column.GetHashCode();
  1361. }
  1362. internal SqlColumn GetRootColumn() {
  1363. SqlColumn c = this.column;
  1364. while (c.Expression != null && c.Expression.NodeType == SqlNodeType.ColumnRef) {
  1365. c = ((SqlColumnRef)c.Expression).Column;
  1366. }
  1367. return c;
  1368. }
  1369. }
  1370. internal class SqlRow : SqlNode {
  1371. private List<SqlColumn> columns;
  1372. internal SqlRow(Expression sourceExpression)
  1373. : base(SqlNodeType.Row, sourceExpression) {
  1374. this.columns = new List<SqlColumn>();
  1375. }
  1376. internal List<SqlColumn> Columns {
  1377. get { return this.columns; }
  1378. }
  1379. internal SqlColumn Find(string name) {
  1380. foreach (SqlColumn c in this.columns) {
  1381. if (name == c.Name)
  1382. return c;
  1383. }
  1384. return null;
  1385. }
  1386. }
  1387. internal class SqlMemberAssign : SqlNode {
  1388. private MemberInfo member;
  1389. private SqlExpression expression;
  1390. internal SqlMemberAssign(MemberInfo member, SqlExpression expr)
  1391. : base(SqlNodeType.MemberAssign, expr.SourceExpression) {
  1392. if (member == null)
  1393. throw Error.ArgumentNull("member");
  1394. this.member = member;
  1395. this.Expression = expr;
  1396. }
  1397. internal MemberInfo Member {
  1398. get { return this.member; }
  1399. }
  1400. internal SqlExpression Expression {
  1401. get { return this.expression; }
  1402. set {
  1403. if (value == null)
  1404. throw Error.ArgumentNull("value");
  1405. this.expression = value;
  1406. }
  1407. }
  1408. }
  1409. internal class SqlGrouping : SqlSimpleTypeExpression {
  1410. private SqlExpression key;
  1411. private SqlExpression group;
  1412. internal SqlGrouping(Type clrType, ProviderType sqlType, SqlExpression key, SqlExpression group, Expression sourceExpression)
  1413. : base(SqlNodeType.Grouping, clrType, sqlType, sourceExpression) {
  1414. if (key == null) throw Error.ArgumentNull("key");
  1415. if (group == null) throw Error.ArgumentNull("group");
  1416. this.key = key;
  1417. this.group = group;
  1418. }
  1419. internal SqlExpression Key {
  1420. get { return this.key; }
  1421. set {
  1422. if (value == null)
  1423. throw Error.ArgumentNull("value");
  1424. if (!this.key.ClrType.IsAssignableFrom(value.ClrType)
  1425. && !value.ClrType.IsAssignableFrom(this.key.ClrType))
  1426. throw Error.ArgumentWrongType("value", this.key.ClrType, value.ClrType);
  1427. this.key = value;
  1428. }
  1429. }
  1430. internal SqlExpression Group {
  1431. get { return this.group; }
  1432. set {
  1433. if (value == null)
  1434. throw Error.ArgumentNull("value");
  1435. if (value.ClrType != this.group.ClrType)
  1436. throw Error.ArgumentWrongType("value", this.group.ClrType, value.ClrType);
  1437. this.group = value;
  1438. }
  1439. }
  1440. }
  1441. internal class SqlNew : SqlSimpleTypeExpression {
  1442. private MetaType metaType;
  1443. private ConstructorInfo constructor;
  1444. private List<SqlExpression> args;
  1445. private List<MemberInfo> argMembers;
  1446. private List<SqlMemberAssign> members;
  1447. internal SqlNew(MetaType metaType, ProviderType sqlType, ConstructorInfo cons, IEnumerable<SqlExpression> args, IEnumerable<MemberInfo> argMembers, IEnumerable<SqlMemberAssign> members, Expression sourceExpression)
  1448. : base(SqlNodeType.New, metaType.Type, sqlType, sourceExpression) {
  1449. this.metaType = metaType;
  1450. if (cons == null && metaType.Type.IsClass) { // structs do not need to have a constructor
  1451. throw Error.ArgumentNull("cons");
  1452. }
  1453. this.constructor = cons;
  1454. this.args = new List<SqlExpression>();
  1455. this.argMembers = new List<MemberInfo>();
  1456. this.members = new List<SqlMemberAssign>();
  1457. if (args != null) {
  1458. this.args.AddRange(args);
  1459. }
  1460. if (argMembers != null) {
  1461. this.argMembers.AddRange(argMembers);
  1462. }
  1463. if (members != null) {
  1464. this.members.AddRange(members);
  1465. }
  1466. }
  1467. internal MetaType MetaType {
  1468. get { return this.metaType; }
  1469. }
  1470. internal ConstructorInfo Constructor {
  1471. get { return this.constructor; }
  1472. }
  1473. internal List<SqlExpression> Args {
  1474. get { return this.args; }
  1475. }
  1476. internal List<MemberInfo> ArgMembers {
  1477. get { return this.argMembers; }
  1478. }
  1479. internal List<SqlMemberAssign> Members {
  1480. get { return this.members; }
  1481. }
  1482. internal SqlExpression Find(MemberInfo mi) {
  1483. for (int i = 0, n = this.argMembers.Count; i < n; i++) {
  1484. MemberInfo argmi = this.argMembers[i];
  1485. if (argmi.Name == mi.Name) {
  1486. return this.args[i];
  1487. }
  1488. }
  1489. foreach (SqlMemberAssign ma in this.Members) {
  1490. if (ma.Member.Name == mi.Name) {
  1491. return ma.Expression;
  1492. }
  1493. }
  1494. return null;
  1495. }
  1496. }
  1497. internal class SqlMethodCall : SqlSimpleTypeExpression {
  1498. private MethodInfo method;
  1499. private SqlExpression obj;
  1500. private List<SqlExpression> arguments;
  1501. internal SqlMethodCall(Type clrType, ProviderType sqlType, MethodInfo method, SqlExpression obj, IEnumerable<SqlExpression> args, Expression sourceExpression)
  1502. : base(SqlNodeType.MethodCall, clrType, sqlType, sourceExpression) {
  1503. if (method == null)
  1504. throw Error.ArgumentNull("method");
  1505. this.method = method;
  1506. this.Object = obj;
  1507. this.arguments = new List<SqlExpression>();
  1508. if (args != null)
  1509. this.arguments.AddRange(args);
  1510. }
  1511. internal MethodInfo Method {
  1512. get { return this.method; }
  1513. }
  1514. internal SqlExpression Object {
  1515. get { return this.obj; }
  1516. set {
  1517. if (value == null && !this.method.IsStatic)
  1518. throw Error.ArgumentNull("value");
  1519. if (value != null && !this.method.DeclaringType.IsAssignableFrom(value.ClrType))
  1520. throw Error.ArgumentWrongType("value", this.method.DeclaringType, value.ClrType);
  1521. this.obj = value;
  1522. }
  1523. }
  1524. internal List<SqlExpression> Arguments {
  1525. get { return this.arguments; }
  1526. }
  1527. }
  1528. internal class SqlIncludeScope : SqlNode {
  1529. SqlNode child;
  1530. internal SqlIncludeScope(SqlNode child, Expression sourceExpression)
  1531. : base(SqlNodeType.IncludeScope, sourceExpression) {
  1532. this.child = child;
  1533. }
  1534. internal SqlNode Child {
  1535. get {return this.child;}
  1536. set {this.child = value;}
  1537. }
  1538. }
  1539. internal class SqlClientArray : SqlSimpleTypeExpression {
  1540. private List<SqlExpression> expressions;
  1541. internal SqlClientArray(Type clrType, ProviderType sqlType, SqlExpression[ ] exprs, Expression sourceExpression)
  1542. : base(SqlNodeType.ClientArray, clrType, sqlType, sourceExpression) {
  1543. this.expressions = new List<SqlExpression>();
  1544. if (exprs != null)
  1545. this.Expressions.AddRange(exprs);
  1546. }
  1547. internal List<SqlExpression> Expressions {
  1548. get { return this.expressions; }
  1549. }
  1550. }
  1551. internal class SqlLink : SqlSimpleTypeExpression {
  1552. private MetaType rowType;
  1553. private SqlExpression expression;
  1554. private MetaDataMember member;
  1555. private List<SqlExpression> keyExpressions;
  1556. private SqlExpression expansion;
  1557. private object id;
  1558. internal SqlLink(object id, MetaType rowType, Type clrType, ProviderType sqlType, SqlExpression expression, MetaDataMember member, IEnumerable<SqlExpression> keyExpressions, SqlExpression expansion, Expression sourceExpression)
  1559. : base(SqlNodeType.Link, clrType, sqlType, sourceExpression) {
  1560. this.id = id;
  1561. this.rowType = rowType;
  1562. this.expansion = expansion;
  1563. this.expression = expression;
  1564. this.member = member;
  1565. this.keyExpressions = new List<SqlExpression>();
  1566. if (keyExpressions != null)
  1567. this.keyExpressions.AddRange(keyExpressions);
  1568. }
  1569. internal MetaType RowType {
  1570. get { return this.rowType; }
  1571. }
  1572. internal SqlExpression Expansion {
  1573. get { return this.expansion; }
  1574. set { this.expansion = value; }
  1575. }
  1576. internal SqlExpression Expression {
  1577. get { return this.expression; }
  1578. set { this.expression = value; }
  1579. }
  1580. internal MetaDataMember Member {
  1581. get { return this.member; }
  1582. }
  1583. internal List<SqlExpression> KeyExpressions {
  1584. get { return this.keyExpressions; }
  1585. }
  1586. internal object Id {
  1587. get { return this.id; }
  1588. }
  1589. }
  1590. internal class SqlExprSet : SqlExpression {
  1591. private List<SqlExpression> expressions;
  1592. internal SqlExprSet(Type clrType, IEnumerable <SqlExpression> exprs, Expression sourceExpression)
  1593. : base(SqlNodeType.ExprSet, clrType, sourceExpression) {
  1594. this.expressions = new List<SqlExpression>(exprs);
  1595. }
  1596. internal List<SqlExpression> Expressions {
  1597. get { return this.expressions; }
  1598. }
  1599. /// <summary>
  1600. /// Get the first non-set expression of the set by drilling
  1601. /// down the left expressions.
  1602. /// </summary>
  1603. internal SqlExpression GetFirstExpression() {
  1604. SqlExpression expr = expressions[0];
  1605. while (expr is SqlExprSet) {
  1606. expr = ((SqlExprSet)expr).Expressions[0];
  1607. }
  1608. return expr;
  1609. }
  1610. internal override ProviderType SqlType {
  1611. get { return this.expressions[0].SqlType; }
  1612. }
  1613. }
  1614. internal class SqlSubSelect : SqlSimpleTypeExpression {
  1615. private SqlSelect select;
  1616. internal SqlSubSelect(SqlNodeType nt , Type clrType, ProviderType sqlType , SqlSelect select)
  1617. : base(nt, clrType, sqlType, select.SourceExpression) {
  1618. switch (nt) {
  1619. case SqlNodeType.Multiset:
  1620. case SqlNodeType.ScalarSubSelect:
  1621. case SqlNodeType.Element:
  1622. case SqlNodeType.Exists:
  1623. break;
  1624. default:
  1625. throw Error.UnexpectedNode(nt);
  1626. }
  1627. this.Select = select;
  1628. }
  1629. internal SqlSelect Select {
  1630. get { return this.select; }
  1631. set {
  1632. if (value == null)
  1633. throw Error.ArgumentNull("value");
  1634. this.select = value;
  1635. }
  1636. }
  1637. }
  1638. internal class SqlClientQuery : SqlSimpleTypeExpression {
  1639. private SqlSubSelect query;
  1640. private List<SqlExpression> arguments;
  1641. private List<SqlParameter> parameters;
  1642. int ordinal;
  1643. internal SqlClientQuery(SqlSubSelect subquery)
  1644. : base(SqlNodeType.ClientQuery, subquery.ClrType, subquery.SqlType, subquery.SourceExpression) {
  1645. this.query = subquery;
  1646. this.arguments = new List<SqlExpression>();
  1647. this.parameters = new List<SqlParameter>();
  1648. }
  1649. internal SqlSubSelect Query {
  1650. get { return this.query; }
  1651. set {
  1652. if (value == null || (this.query != null && this.query.ClrType != value.ClrType))
  1653. throw Error.ArgumentWrongType(value, this.query.ClrType, value.ClrType);
  1654. this.query = value;
  1655. }
  1656. }
  1657. internal List<SqlExpression> Arguments {
  1658. get { return this.arguments; }
  1659. }
  1660. internal List<SqlParameter> Parameters {
  1661. get { return this.parameters; }
  1662. }
  1663. internal int Ordinal {
  1664. get { return this.ordinal; }
  1665. set { this.ordinal = value; }
  1666. }
  1667. }
  1668. internal class SqlJoinedCollection : SqlSimpleTypeExpression {
  1669. private SqlExpression expression;
  1670. private SqlExpression count;
  1671. internal SqlJoinedCollection(Type clrType, ProviderType sqlType, SqlExpression expression, SqlExpression count, Expression sourceExpression)
  1672. : base(SqlNodeType.JoinedCollection, clrType, sqlType, sourceExpression) {
  1673. this.expression = expression;
  1674. this.count = count;
  1675. }
  1676. internal SqlExpression Expression {
  1677. get { return this.expression; }
  1678. set {
  1679. if (value == null || this.expression != null && this.expression.ClrType != value.ClrType)
  1680. throw Error.ArgumentWrongType(value, this.expression.ClrType, value.ClrType);
  1681. this.expression = value;
  1682. }
  1683. }
  1684. internal SqlExpression Count {
  1685. get { return this.count; }
  1686. set {
  1687. if (value == null)
  1688. throw Error.ArgumentNull("value");
  1689. if (value.ClrType != typeof(int))
  1690. throw Error.ArgumentWrongType(value, typeof(int), value.ClrType);
  1691. this.count = value;
  1692. }
  1693. }
  1694. }
  1695. internal class SqlUpdate : SqlStatement {
  1696. private SqlSelect select;
  1697. private List<SqlAssign> assignments;
  1698. internal SqlUpdate(SqlSelect select, IEnumerable<SqlAssign> assignments, Expression sourceExpression)
  1699. : base(SqlNodeType.Update, sourceExpression) {
  1700. this.Select = select;
  1701. this.assignments = new List<SqlAssign>(assignments);
  1702. }
  1703. internal SqlSelect Select {
  1704. get { return this.select; }
  1705. set {
  1706. if (value == null)
  1707. throw Error.ArgumentNull("value");
  1708. this.select = value;
  1709. }
  1710. }
  1711. internal List<SqlAssign> Assignments {
  1712. get { return this.assignments; }
  1713. }
  1714. }
  1715. internal class SqlInsert : SqlStatement {
  1716. private SqlTable table;
  1717. private SqlRow row;
  1718. private SqlExpression expression;
  1719. private SqlColumn outputKey;
  1720. private bool outputToLocal;
  1721. internal SqlInsert(SqlTable table, SqlExpression expr, Expression sourceExpression)
  1722. : base(SqlNodeType.Insert, sourceExpression) {
  1723. this.Table = table;
  1724. this.Expression = expr;
  1725. this.Row = new SqlRow(sourceExpression);
  1726. }
  1727. internal SqlTable Table {
  1728. get { return this.table; }
  1729. set {
  1730. if (value == null)
  1731. throw Error.ArgumentNull("null");
  1732. this.table = value;
  1733. }
  1734. }
  1735. internal SqlRow Row {
  1736. get { return this.row; }
  1737. set { this.row = value; }
  1738. }
  1739. internal SqlExpression Expression {
  1740. get { return this.expression; }
  1741. set {
  1742. if (value == null)
  1743. throw Error.ArgumentNull("null");
  1744. if (!this.table.RowType.Type.IsAssignableFrom(value.ClrType))
  1745. throw Error.ArgumentWrongType("value", this.table.RowType, value.ClrType);
  1746. this.expression = value;
  1747. }
  1748. }
  1749. internal SqlColumn OutputKey {
  1750. get { return this.outputKey; }
  1751. set { this.outputKey = value; }
  1752. }
  1753. internal bool OutputToLocal {
  1754. get { return this.outputToLocal; }
  1755. set { this.outputToLocal = value; }
  1756. }
  1757. }
  1758. internal class SqlDelete : SqlStatement {
  1759. private SqlSelect select;
  1760. internal SqlDelete(SqlSelect select, Expression sourceExpression)
  1761. : base(SqlNodeType.Delete, sourceExpression) {
  1762. this.Select = select;
  1763. }
  1764. internal SqlSelect Select {
  1765. get { return this.select; }
  1766. set {
  1767. if (value == null)
  1768. throw Error.ArgumentNull("value");
  1769. this.select = value;
  1770. }
  1771. }
  1772. }
  1773. internal class SqlBlock : SqlStatement {
  1774. private List<SqlStatement> statements;
  1775. internal SqlBlock(Expression sourceExpression)
  1776. : base(SqlNodeType.Block, sourceExpression) {
  1777. this.statements = new List<SqlStatement>();
  1778. }
  1779. internal List<SqlStatement> Statements {
  1780. get { return this.statements; }
  1781. }
  1782. }
  1783. internal class SqlAssign : SqlStatement {
  1784. private SqlExpression leftValue;
  1785. private SqlExpression rightValue;
  1786. internal SqlAssign(SqlExpression lValue, SqlExpression rValue, Expression sourceExpression)
  1787. : base(SqlNodeType.Assign, sourceExpression) {
  1788. this.LValue = lValue;
  1789. this.RValue = rValue;
  1790. }
  1791. internal SqlExpression LValue {
  1792. get { return this.leftValue; }
  1793. set {
  1794. if (value == null)
  1795. throw Error.ArgumentNull("value");
  1796. if (this.rightValue != null && !value.ClrType.IsAssignableFrom(this.rightValue.ClrType))
  1797. throw Error.ArgumentWrongType("value", this.rightValue.ClrType, value.ClrType);
  1798. this.leftValue = value;
  1799. }
  1800. }
  1801. internal SqlExpression RValue {
  1802. get { return this.rightValue; }
  1803. set {
  1804. if (value == null)
  1805. throw Error.ArgumentNull("value");
  1806. if (this.leftValue != null && !this.leftValue.ClrType.IsAssignableFrom(value.ClrType))
  1807. throw Error.ArgumentWrongType("value", this.leftValue.ClrType, value.ClrType);
  1808. this.rightValue = value;
  1809. }
  1810. }
  1811. }
  1812. internal class SqlDoNotVisitExpression : SqlExpression {
  1813. private SqlExpression expression;
  1814. internal SqlDoNotVisitExpression(SqlExpression expr)
  1815. : base(SqlNodeType.DoNotVisit, expr.ClrType, expr.SourceExpression) {
  1816. if (expr == null)
  1817. throw Error.ArgumentNull("expr");
  1818. this.expression = expr;
  1819. }
  1820. internal SqlExpression Expression {
  1821. get { return this.expression; }
  1822. }
  1823. internal override ProviderType SqlType {
  1824. get { return this.expression.SqlType; }
  1825. }
  1826. }
  1827. internal class SqlOptionalValue : SqlSimpleTypeExpression {
  1828. private SqlExpression hasValue;
  1829. private SqlExpression expressionValue;
  1830. internal SqlOptionalValue( SqlExpression hasValue, SqlExpression value)
  1831. : base(SqlNodeType.OptionalValue, value.ClrType, value.SqlType, value.SourceExpression) {
  1832. this.HasValue = hasValue;
  1833. this.Value = value;
  1834. }
  1835. internal SqlExpression HasValue {
  1836. get { return this.hasValue; }
  1837. set {
  1838. if (value == null)
  1839. throw Error.ArgumentNull("value");
  1840. this.hasValue = value;
  1841. }
  1842. }
  1843. internal SqlExpression Value {
  1844. get { return this.expressionValue; }
  1845. set {
  1846. if (value == null)
  1847. throw Error.ArgumentNull("value");
  1848. if (value.ClrType != this.ClrType)
  1849. throw Error.ArgumentWrongType("value", this.ClrType, value.ClrType);
  1850. this.expressionValue = value;
  1851. }
  1852. }
  1853. }
  1854. internal class SqlFunctionCall : SqlSimpleTypeExpression {
  1855. private string name;
  1856. private List<SqlExpression> arguments;
  1857. internal SqlFunctionCall(Type clrType, ProviderType sqlType, string name, IEnumerable <SqlExpression > args , Expression source)
  1858. : this(SqlNodeType.FunctionCall, clrType , sqlType, name, args, source) {
  1859. }
  1860. internal SqlFunctionCall(SqlNodeType nodeType, Type clrType, ProviderType sqlType, string name , IEnumerable <SqlExpression> args , Expression source)
  1861. : base(nodeType, clrType, sqlType, source) {
  1862. this.name = name;
  1863. this.arguments = new List<SqlExpression>(args);
  1864. }
  1865. internal string Name {
  1866. get { return this.name; }
  1867. }
  1868. internal List<SqlExpression> Arguments {
  1869. get { return this.arguments; }
  1870. }
  1871. }
  1872. /// <summary>
  1873. /// This class is used to represent a table value function. It inherits normal function
  1874. /// call functionality, and adds TVF specific members.
  1875. /// </summary>
  1876. internal class SqlTableValuedFunctionCall : SqlFunctionCall {
  1877. private MetaType rowType;
  1878. private List<SqlColumn> columns;
  1879. internal SqlTableValuedFunctionCall(MetaType rowType, Type clrType, ProviderType sqlType, string name, IEnumerable <SqlExpression > args , Expression source)
  1880. : base(SqlNodeType.TableValuedFunctionCall, clrType , sqlType, name, args, source) {
  1881. this.rowType = rowType;
  1882. this.columns = new List<SqlColumn>();
  1883. }
  1884. internal MetaType RowType {
  1885. get { return this.rowType; }
  1886. }
  1887. internal List<SqlColumn> Columns {
  1888. get { return this.columns; }
  1889. }
  1890. internal SqlColumn Find(string name) {
  1891. foreach (SqlColumn c in this.Columns) {
  1892. if (c.Name == name)
  1893. return c;
  1894. }
  1895. return null;
  1896. }
  1897. }
  1898. internal class SqlSharedExpression : SqlExpression {
  1899. private SqlExpression expr;
  1900. internal SqlSharedExpression(SqlExpression expr)
  1901. : base(SqlNodeType.SharedExpression, expr.ClrType, expr.SourceExpression) {
  1902. this.expr = expr;
  1903. }
  1904. internal SqlExpression Expression {
  1905. get { return this.expr; }
  1906. set {
  1907. if (value == null)
  1908. throw Error.ArgumentNull("value");
  1909. if (!this.ClrType.IsAssignableFrom(value.ClrType)
  1910. && !value.ClrType.IsAssignableFrom(this.ClrType))
  1911. throw Error.ArgumentWrongType("value", this.ClrType, value.ClrType);
  1912. this.expr = value;
  1913. }
  1914. }
  1915. internal override ProviderType SqlType {
  1916. get { return this.expr.SqlType; }
  1917. }
  1918. }
  1919. internal class SqlSharedExpressionRef : SqlExpression {
  1920. private SqlSharedExpression expr;
  1921. internal SqlSharedExpressionRef(SqlSharedExpression expr)
  1922. : base(SqlNodeType.SharedExpressionRef, expr.ClrType, expr.SourceExpression) {
  1923. this.expr = expr;
  1924. }
  1925. internal SqlSharedExpression SharedExpression {
  1926. get { return this.expr; }
  1927. }
  1928. internal override ProviderType SqlType {
  1929. get { return this.expr.SqlType; }
  1930. }
  1931. }
  1932. internal class SqlSimpleExpression : SqlExpression {
  1933. private SqlExpression expr;
  1934. internal SqlSimpleExpression(SqlExpression expr)
  1935. : base(SqlNodeType.SimpleExpression, expr.ClrType, expr.SourceExpression) {
  1936. this.expr = expr;
  1937. }
  1938. internal SqlExpression Expression {
  1939. get { return this.expr; }
  1940. set {
  1941. if (value == null)
  1942. throw Error.ArgumentNull("value");
  1943. if (!TypeSystem.GetNonNullableType(this.ClrType).IsAssignableFrom(TypeSystem.GetNonNullableType(value.ClrType)))
  1944. throw Error.ArgumentWrongType("value", this.ClrType, value.ClrType);
  1945. this.expr = value;
  1946. }
  1947. }
  1948. internal override ProviderType SqlType {
  1949. get { return this.expr.SqlType; }
  1950. }
  1951. }
  1952. internal class SqlClientParameter : SqlSimpleTypeExpression {
  1953. // Expression<Func<object[], T>>
  1954. LambdaExpression accessor;
  1955. internal SqlClientParameter(Type clrType, ProviderType sqlType, LambdaExpression accessor, Expression sourceExpression):
  1956. base(SqlNodeType.ClientParameter, clrType, sqlType, sourceExpression) {
  1957. this.accessor = accessor;
  1958. }
  1959. internal LambdaExpression Accessor {
  1960. get { return this.accessor; }
  1961. }
  1962. }
  1963. }