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); }