private DataTypeInfo GetTypeFromFunction(DataTypeInfo currentDataType, SqlBuiltinScalarFunctionCallExpression function, MemoryDatabase database) { DataTypeInfo dataType = SelectDataBuilder.GetDataTypeFromFunction(function.FunctionName); if (dataType != null) { return(dataType); } if (function is SqlConvertExpression convert) { return(new DataTypeInfo(convert.DataType.Sql, database.UserDataTypes)); } var dataTypes = new List <DataTypeInfo>( ); foreach (var argument in function.Arguments) { var newDataType = GuessDataType(argument, null, database); if (newDataType != null) { dataTypes.Add(newDataType); } } dataType = dataTypes.FirstOrDefault(d => d is Column) ?? dataTypes.FirstOrDefault( ); if (dataType != null) { return(dataType); } return(currentDataType); }
private void AddRowValue(ArrayList row, Column column, SqlCodeObject value) { if (column.IsIdentity && column.ParentTable.IsIdentityInsertForbidden || column.IsRowVersion) { throw new SqlUpdateColumnForbiddenException(column.Name); } switch (value) { case SqlLiteralExpression literal: { row[column.Order] = Helper.GetValueFromString(column, literal); break; } case SqlBuiltinScalarFunctionCallExpression function: { var select = new SelectDataBuilder( ).Build(function, new RawData(_Command)); row[column.Order] = select.Select(new RawTableJoinRow()); break; } case SqlScalarVariableRefExpression variableRef: { var select = new SelectDataFromVariables(variableRef, _Command); row[column.Order] = select.Select(new RawTableJoinRow()); break; } default: throw new NotImplementedException($"Value of type {value.GetType( )} is not supported"); } ValidateDataSize(column, row[column.Order]); }
public static FullTypeInfo DetermineFullTypeInfo(SqlScalarExpression expression, RawData rawData) { switch (expression) { case SqlColumnRefExpression columnRef: { var field = Helper.GetTableColumn(columnRef, rawData); return(new FullTypeInfo { DbDataType = field.Column.DbDataType, NetDataType = field.Column.NetDataType }); } case SqlScalarVariableRefExpression variableRef: { // Helper.GetValueFromParameter( variableRef.VariableName, rawData.Parameters ); return(null); } case SqlScalarRefExpression scalarRef: { var field = Helper.GetTableColumn((SqlObjectIdentifier)scalarRef.MultipartIdentifier, rawData); return(new FullTypeInfo { DbDataType = field.Column.DbDataType, NetDataType = field.Column.NetDataType }); } case SqlAggregateFunctionCallExpression functionCall: { var selectFunction = new SelectDataBuilder( ).Build(functionCall, rawData); return(new FullTypeInfo { DbDataType = selectFunction.DbType, NetDataType = selectFunction.ReturnType }); } case SqlSearchedCaseExpression caseExpression: { var selectFunction = new SelectDataFromCaseExpression(caseExpression, rawData); return(new FullTypeInfo { DbDataType = selectFunction.DbType, NetDataType = selectFunction.ReturnType }); } case SqlLiteralExpression literalExpression: { return(new FullTypeInfo { DbDataType = GetDbTypeFromLiteralType(literalExpression.Type), NetDataType = GetTypeFromLiteralType(literalExpression.Type) }); } } return(null); }
public static Type DetermineType(SqlScalarExpression expression, RawData rawData) { if (expression is SqlUnaryScalarExpression unaryScalarExpression) { expression = unaryScalarExpression.Expression; } switch (expression) { case SqlColumnRefExpression columnRef: { var field = Helper.GetTableColumn(columnRef, rawData); return(field.Column.NetDataType); } case SqlScalarVariableRefExpression variableRef: { var parameter = GetParameter(variableRef.VariableName, rawData.Command.Parameters, rawData.Command.Variables); return(parameter.NetDataType); } case SqlScalarRefExpression scalarRef: { var field = Helper.GetTableColumn((SqlObjectIdentifier)scalarRef.MultipartIdentifier, rawData); return(field.Column.NetDataType); } case SqlAggregateFunctionCallExpression functionCall: { var selectFunction = new SelectDataBuilder( ).Build(functionCall, rawData); return(selectFunction.ReturnType); } case SqlSearchedCaseExpression caseExpression: { var selectFunction = new SelectDataFromCaseExpression(caseExpression, rawData); return(selectFunction.ReturnType); } case SqlLiteralExpression literalExpression: { return(GetTypeFromLiteralType(literalExpression.Type)); } case SqlBinaryScalarExpression binaryScalarExpression: { var selectFunction = new SelectDataFromBinaryScalarExpression(binaryScalarExpression, rawData); return(selectFunction.ReturnType); } } return(null); }
public static object GetValue(SqlScalarExpression expression, Type type, RawData rawData, List <RawTableJoinRow> rows) { switch (expression) { case SqlAggregateFunctionCallExpression functionCall: var selectFunction = new SelectDataBuilder( ).Build(functionCall, rawData) as ISelectDataAggregate; return(selectFunction.Select(rows)); default: return(GetValue(expression, type, rawData, rows.First( ))); } }
private void AddFieldForFunctionCall(SqlBuiltinScalarFunctionCallExpression functionCall, string name, MemoryDbDataReader.ResultBatch batch, RawData rawData) { var select = new SelectDataBuilder( ).Build(functionCall, rawData); AddFieldFromSelectData(name, batch, select); }
private void AddFieldFromGlobalVariable(SqlGlobalScalarVariableRefExpression globalRef, string name, MemoryDbDataReader.ResultBatch batch, RawData rawData) { var select = new SelectDataBuilder( ).BuildGlobalVariable(globalRef.VariableName, rawData); AddFieldFromSelectData(name, batch, select); }
public static object GetValue(SqlScalarExpression expression, Type type, RawData rawData, List <RawTableRow> row, bool getTypeFromLiteral = false) { switch (expression) { case SqlColumnRefExpression columnRef: { var field = GetTableColumn(columnRef, rawData); var select = new SelectDataFromColumn(field, rawData); return(GetReturnValue(select, row)); } case SqlUnaryScalarExpression unaryScalarExpression: { var value = GetValue(unaryScalarExpression.Expression, type, rawData, row); if (unaryScalarExpression.Operator == SqlUnaryScalarOperatorType.Negative) { value = HelperReflection.Negate(value); } return(value); } case SqlLiteralExpression literal: { if (literal.Type == LiteralValueType.Null) { return(null); } var literalType = getTypeFromLiteral ? GetTypeFromLiteralType(literal.Type) : type; return(GetValueFromString(literalType, literal)); } case SqlScalarVariableRefExpression variableRef: { return(GetValueFromParameter(variableRef.VariableName, rawData.Parameters, rawData.Command.Variables)); } case SqlScalarRefExpression scalarRef: { var field = GetTableColumn((SqlObjectIdentifier)scalarRef.MultipartIdentifier, rawData); var select = new SelectDataFromColumn(field, rawData); return(GetReturnValue(select, row)); } case SqlGlobalScalarVariableRefExpression globalRef: { var select = new SelectDataFromGlobalVariables(globalRef.VariableName, rawData); return(GetReturnValue(select, row)); } case SqlBuiltinScalarFunctionCallExpression functionCall: { var select = new SelectDataBuilder( ).Build(functionCall, rawData); return(GetReturnValue(select, row)); } case SqlSearchedCaseExpression caseExpression: { var select = new SelectDataFromCaseExpression(caseExpression, rawData); return(GetReturnValue(select, row)); } case SqlScalarSubQueryExpression subQuery: { var database = new MemoryDbConnection().GetMemoryDatabase( ); var command = new MemoryDbCommand(rawData.Command.Connection, rawData.Command.Parameters, rawData.Command.Variables); return(database.ExecuteSqlScalar(subQuery.QueryExpression.Sql, command)); } case SqlBinaryScalarExpression binaryScalarExpression: { var select = new SelectDataFromBinaryScalarExpression(binaryScalarExpression, rawData); return(GetReturnValue(select, row)); } default: throw new NotImplementedException($"Unsupported scalarExpression : '{ expression.GetType( ) }'"); } }