private static ColumnDescriptionItem GetExpandedColumn(OracleReference objectReference, OracleColumn column, bool isPseudocolumn) { var nullable = objectReference?.SchemaObject.GetTargetSchemaObject() is OracleView ? (bool?)null : column.Nullable; return new ColumnDescriptionItem { OwnerIdentifier = objectReference?.FullyQualifiedObjectName ?? OracleObjectIdentifier.Empty, ColumnName = OracleCodeCompletionProvider.GetPrettyColumnName(column.Name), DataType = column.FullTypeName, Nullable = nullable, IsPseudocolumn = isPseudocolumn, IsHidden = column.Hidden }; }
private static bool TryResolveDataTypeFromExpression(StatementGrammarNode expressionNode, OracleColumn column) { if (expressionNode == null || expressionNode.TerminalCount == 0 || !String.Equals(expressionNode.Id, NonTerminals.Expression)) { return false; } var isChainedExpression = expressionNode[NonTerminals.ExpressionMathOperatorChainedList] != null; if (isChainedExpression) { return false; } var analyzedNode = expressionNode[NonTerminals.ParenthesisEnclosedExpression, NonTerminals.Expression]; if (analyzedNode != null) { return TryResolveDataTypeFromExpression(analyzedNode, column); } analyzedNode = expressionNode[NonTerminals.CastOrXmlCastFunction, NonTerminals.CastFunctionParameterClause, NonTerminals.AsDataType, NonTerminals.DataType]; if (analyzedNode != null) { column.DataType = OracleReferenceBuilder.ResolveDataTypeFromNode(analyzedNode); column.Nullable = true; return true; } if (String.Equals(expressionNode.FirstTerminalNode.Id, Terminals.Collect)) { column.DataType = OracleDataType.DynamicCollectionType; column.Nullable = true; return true; } var tokenValue = expressionNode.FirstTerminalNode.Token.Value; string literalInferredDataTypeName = null; var literalInferredDataType = new OracleDataType(); var nullable = false; switch (expressionNode.FirstTerminalNode.Id) { case Terminals.StringLiteral: if (expressionNode.TerminalCount != 1) { break; } if (tokenValue[0] == 'n' || tokenValue[0] == 'N') { literalInferredDataTypeName = TerminalValues.NChar; } else { literalInferredDataTypeName = TerminalValues.Char; } literalInferredDataType.Length = tokenValue.ToPlainString().Length; nullable = literalInferredDataType.Length == 0; break; case Terminals.NumberLiteral: if (expressionNode.TerminalCount != 1) { break; } literalInferredDataTypeName = TerminalValues.Number; /*if (includeLengthPrecisionAndScale) { literalInferredDataType.Precision = GetNumberPrecision(tokenValue); int? scale = null; if (literalInferredDataType.Precision.HasValue) { var indexDecimalDigit = tokenValue.IndexOf('.'); if (indexDecimalDigit != -1) { scale = tokenValue.Length - indexDecimalDigit - 1; } } literalInferredDataType.Scale = scale; }*/ break; case Terminals.Date: if (expressionNode.TerminalCount == 2) { literalInferredDataTypeName = TerminalValues.Date; } break; case Terminals.Timestamp: if (expressionNode.TerminalCount == 2) { literalInferredDataTypeName = TerminalValues.Timestamp; literalInferredDataType.Scale = 9; } break; } if (literalInferredDataTypeName != null) { literalInferredDataType.FullyQualifiedName = OracleObjectIdentifier.Create(null, literalInferredDataTypeName); column.DataType = literalInferredDataType; column.Nullable = nullable; return true; } return false; }
public static bool TryResolveDataTypeFromExpression(StatementGrammarNode expressionNode, OracleColumn column) { if (expressionNode == null || expressionNode.TerminalCount == 0 || !String.Equals(expressionNode.Id, NonTerminals.Expression)) { return(false); } expressionNode = expressionNode.UnwrapIfNonChainedExpressionWithinParentheses(out var isChainedExpression); if (isChainedExpression) { return(false); } var analyzedNode = expressionNode[NonTerminals.CastOrXmlCastFunction, NonTerminals.CastFunctionParameterClause, NonTerminals.AsDataType, NonTerminals.DataType]; if (analyzedNode != null) { column.DataType = OracleReferenceBuilder.ResolveDataTypeFromNode(analyzedNode); column.Nullable = true; return(true); } if (String.Equals(expressionNode.FirstTerminalNode.Id, Terminals.Collect)) { column.DataType = OracleDataType.DynamicCollectionType; column.Nullable = true; return(true); } var tokenValue = expressionNode.FirstTerminalNode.Token.Value; string literalInferredDataTypeName = null; var literalInferredDataType = new OracleDataType(); var nullable = false; switch (expressionNode.FirstTerminalNode.Id) { case Terminals.StringLiteral: if (expressionNode.TerminalCount != 1) { break; } if (tokenValue[0] == 'n' || tokenValue[0] == 'N') { literalInferredDataTypeName = TerminalValues.NChar; } else { literalInferredDataTypeName = TerminalValues.Char; } literalInferredDataType.Length = tokenValue.ToPlainString().Length; nullable = literalInferredDataType.Length == 0; break; case Terminals.NumberLiteral: if (expressionNode.TerminalCount != 1) { break; } switch (tokenValue[tokenValue.Length - 1]) { case 'f': case 'F': literalInferredDataTypeName = TerminalValues.BinaryFloat; break; case 'd': case 'D': literalInferredDataTypeName = TerminalValues.BinaryDouble; break; default: literalInferredDataTypeName = TerminalValues.Number; break; } /*if (includeLengthPrecisionAndScale) * { * literalInferredDataType.Precision = GetNumberPrecision(tokenValue); * int? scale = null; * if (literalInferredDataType.Precision.HasValue) * { * var indexDecimalDigit = tokenValue.IndexOf('.'); * if (indexDecimalDigit != -1) * { * scale = tokenValue.Length - indexDecimalDigit - 1; * } * } * * literalInferredDataType.Scale = scale; * }*/ break; case Terminals.Date: if (expressionNode.TerminalCount == 2) { literalInferredDataTypeName = TerminalValues.Date; } break; case Terminals.Timestamp: if (expressionNode.TerminalCount == 2) { var timestampStringValue = expressionNode.LastTerminalNode.Token.Value.ToPlainString(); var timeZoneElement = OracleStatementValidator.TimestampValidator.Match(timestampStringValue).Groups["Timezone"]; literalInferredDataTypeName = timeZoneElement.Success ? OracleDatabaseModelBase.BuiltInDataTypeTimestampWithTimeZone : TerminalValues.Timestamp; literalInferredDataType.Scale = 9; } break; } if (literalInferredDataTypeName != null) { literalInferredDataType.FullyQualifiedName = OracleObjectIdentifier.Create(null, literalInferredDataTypeName); column.DataType = literalInferredDataType; column.Nullable = nullable; return(true); } return(false); }
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) { var objectReference = columnReference.ValidObjectReference as OracleDataObjectReference; if (objectReference != null) { _columnDescription.Nullable = objectReference.IsOuterJoined; } } } else if (!IsAsterisk && RootNode.TerminalCount > 0) { var expressionNode = RootNode[0]; if (String.Equals(expressionNode.Id, NonTerminals.AliasedExpression)) { expressionNode = expressionNode[0]; } if (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; } } } } return _columnDescription; }