コード例 #1
0
        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);
        }
コード例 #2
0
        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]);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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( )));
            }
        }
コード例 #6
0
        private void AddFieldForFunctionCall(SqlBuiltinScalarFunctionCallExpression functionCall, string name, MemoryDbDataReader.ResultBatch batch, RawData rawData)
        {
            var select = new SelectDataBuilder(  ).Build(functionCall, rawData);

            AddFieldFromSelectData(name, batch, select);
        }
コード例 #7
0
        private void AddFieldFromGlobalVariable(SqlGlobalScalarVariableRefExpression globalRef, string name, MemoryDbDataReader.ResultBatch batch, RawData rawData)
        {
            var select = new SelectDataBuilder(  ).BuildGlobalVariable(globalRef.VariableName, rawData);

            AddFieldFromSelectData(name, batch, select);
        }
コード例 #8
0
        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(  ) }'");
            }
        }