示例#1
0
        public static void ValidateCondition(OracleValidationModel validationModel, OracleColumnReference columnReference)
        {
            var columnDataTypeName = columnReference.ColumnDescription?.DataType.FullyQualifiedName.NormalizedName.Trim('"');

            if (String.IsNullOrEmpty(columnDataTypeName) || !columnReference.ColumnDescription.DataType.IsPrimitive)
            {
                return;
            }

            var condition = FindCondition(columnReference.RootNode);

            if (condition == null)
            {
                return;
            }

            var expression2 = condition[2];

            if (String.Equals(condition[1]?.Id, NonTerminals.RelationalOperator) &&
                String.Equals(expression2?.Id, NonTerminals.Expression))
            {
                var expression1         = condition[0];
                var referenceExpression = columnReference.RootNode.GetAncestor(NonTerminals.Expression);

                var expressionToCheck = expression1 == referenceExpression
                                        ? expression2
                                        : expression1;

                if (expressionToCheck[NonTerminals.ExpressionMathOperatorChainedList] != null)
                {
                    return;
                }

                var dummyColumn = new OracleColumn();
                if (!OracleDataType.TryResolveDataTypeFromExpression(expressionToCheck, dummyColumn))
                {
                    return;
                }

                var literalDataTypeName = dummyColumn.DataType.FullyQualifiedName.NormalizedName.Trim('"');

                var isColumnTimeOrNumber  = IsTime(columnDataTypeName) || IsNumeric(columnDataTypeName);
                var isLiteralTimeOrNumber = IsTime(literalDataTypeName) || IsNumeric(literalDataTypeName);
                if (isColumnTimeOrNumber && IsText(literalDataTypeName) || isLiteralTimeOrNumber && IsText(columnDataTypeName))
                {
                    validationModel.AddNonTerminalSuggestion(expressionToCheck, String.Format(OracleSuggestionType.ImplicitConversionWarning, columnDataTypeName, literalDataTypeName));
                }
            }
        }
        private OracleColumn BuildColumnDescription()
        {
            var columnReference = IsDirectReference && ColumnReferences.Count == 1
                                ? ColumnReferences[0]
                                : null;

            var columnDescription = columnReference?.ColumnDescription;

            _columnDescription =
                new OracleColumn
            {
                Name     = ColumnName,
                Nullable = columnDescription == null,
                DataType = OracleDataType.Empty
            };

            if (columnDescription != null)
            {
                _columnDescription.Nullable      = columnDescription.Nullable;
                _columnDescription.DataType      = columnDescription.DataType;
                _columnDescription.CharacterSize = columnDescription.CharacterSize;

                if (!_columnDescription.Nullable)
                {
                    if (columnReference.ValidObjectReference is OracleDataObjectReference objectReference)
                    {
                        _columnDescription.Nullable = objectReference.IsOuterJoined;
                    }
                }
            }
            if (IsAsterisk || RootNode.TerminalCount == 0)
            {
                return(_columnDescription);
            }

            var expressionNode = RootNode[0];

            if (String.Equals(expressionNode.Id, NonTerminals.AliasedExpression))
            {
                expressionNode = expressionNode[0];
            }

            if (OracleDataType.TryResolveDataTypeFromExpression(expressionNode, _columnDescription) && !_columnDescription.DataType.IsDynamicCollection)
            {
                if (_columnDescription.DataType.FullyQualifiedName.Name.EndsWith("CHAR"))
                {
                    _columnDescription.CharacterSize = _columnDescription.DataType.Length;
                }

                var isBuiltInDataType = _columnDescription.DataType.IsPrimitive && OracleDatabaseModelBase.BuiltInDataTypes.Any(t => String.Equals(t, _columnDescription.DataType.FullyQualifiedName.Name));
                if (!isBuiltInDataType && SemanticModel.HasDatabaseModel)
                {
                    var oracleType = SemanticModel.DatabaseModel.GetFirstSchemaObject <OracleTypeBase>(_columnDescription.DataType.FullyQualifiedName);
                    if (oracleType == null)
                    {
                        _columnDescription.DataType = OracleDataType.Empty;
                    }
                }
            }
            else if (columnDescription == null)
            {
                expressionNode = expressionNode.UnwrapIfNonChainedExpressionWithinParentheses(out bool isChainedExpression);

                if (!isChainedExpression)
                {
                    var programReference = ProgramReferences.SingleOrDefault(r => r.RootNode == expressionNode);
                    if (programReference == null)
                    {
                        var typeReference = TypeReferences.SingleOrDefault(r => r.RootNode == expressionNode);
                        if (typeReference?.Metadata != null)
                        {
                            var x = typeReference.Metadata.ReturnParameter.CustomDataType;
                        }
                    }
                    else if (programReference.Metadata != null)
                    {
                        if (programReference.Metadata.ReturnParameter == null)
                        {
                            if (programReference.Metadata.Identifier == OracleProgramIdentifier.IdentifierBuiltInProgramCoalesce)
                            {
                            }
                            else if (programReference.Metadata.Identifier == OracleProgramIdentifier.IdentifierBuiltInProgramBinaryToNumber)
                            {
                                _columnDescription.DataType = OracleDataType.NumberType;
                            }
                        }
                        else if (!String.IsNullOrEmpty(programReference.Metadata.ReturnParameter.DataType))
                        {
                            if (programReference.Metadata.Identifier != OracleProgramIdentifier.IdentifierBuiltInProgramNvl)
                            {
                                _columnDescription.DataType = new OracleDataType {
                                    FullyQualifiedName = OracleObjectIdentifier.Create(null, programReference.Metadata.ReturnParameter.DataType)
                                };

                                switch (programReference.Metadata.ReturnParameter.DataType)
                                {
                                case TerminalValues.Varchar:
                                case TerminalValues.Varchar2:
                                    _columnDescription.CharacterSize = _columnDescription.DataType.Length = SemanticModel.DatabaseModel.MaximumVarcharLength;
                                    break;

                                case TerminalValues.Raw:
                                    _columnDescription.DataType.Length = SemanticModel.DatabaseModel.MaximumRawLength;
                                    break;

                                case TerminalValues.NVarchar:
                                case TerminalValues.NVarchar2:
                                    _columnDescription.CharacterSize = _columnDescription.DataType.Length = SemanticModel.DatabaseModel.MaximumNVarcharLength;
                                    break;

                                case TerminalValues.Timestamp:
                                    _columnDescription.DataType = OracleDataType.CreateTimestampDataType(9);
                                    break;

                                case OracleDatabaseModelBase.BuiltInDataTypeTimestampWithTimeZone:
                                    _columnDescription.DataType = OracleDataType.CreateTimestampWithTimeZoneDataType(9);
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(_columnDescription);
        }