private static void TryResolveNumericPrecisionAndScale(OracleDataTypeReference dataTypeReference, StatementGrammarNode definitionNode) { var numericPrecisionScaleNode = definitionNode[NonTerminals.DataTypeNumericPrecisionAndScale]; var precisionValueTerminal = numericPrecisionScaleNode?[NonTerminals.IntegerOrAsterisk, Terminals.IntegerLiteral]; if (precisionValueTerminal == null) { return; } dataTypeReference.ResolvedDataType.Precision = Convert.ToInt32(precisionValueTerminal.Token.Value); dataTypeReference.PrecisionNode = precisionValueTerminal; var negativeIntegerNonTerminal = numericPrecisionScaleNode[NonTerminals.Scale, NonTerminals.NegativeInteger]; if (negativeIntegerNonTerminal == null) { return; } dataTypeReference.ResolvedDataType.Scale = Convert.ToInt32(negativeIntegerNonTerminal.LastTerminalNode.Token.Value); dataTypeReference.ScaleNode = negativeIntegerNonTerminal; if (String.Equals(negativeIntegerNonTerminal.FirstTerminalNode.Id, Terminals.MathMinus)) { dataTypeReference.ResolvedDataType.Scale = -dataTypeReference.ResolvedDataType.Scale; } }
public static bool TryCreatePlSqlDataTypeReference(OraclePlSqlProgram program, StatementGrammarNode dataTypeNode, out OracleDataTypeReference dataTypeReference) { StatementGrammarNode ownerNode = null; StatementGrammarNode typeIdentifier = null; var firstChild = dataTypeNode[0]; switch (firstChild?.Id) { case NonTerminals.AssignmentStatementTarget: var plSqlAssignmentTarget = firstChild[NonTerminals.PlSqlAssignmentTarget]; var percentCharacterTypeOrRowTypeNotFound = dataTypeNode.ChildNodes.Count == 1; if (percentCharacterTypeOrRowTypeNotFound && plSqlAssignmentTarget != null) { var chainedIdentifiers = GatherChainedIdentifiers(plSqlAssignmentTarget).ToList(); if (chainedIdentifiers.Count <= 2) { typeIdentifier = chainedIdentifiers.LastOrDefault(); ownerNode = chainedIdentifiers.FirstOrDefault(i => i != typeIdentifier); } } break; case NonTerminals.BuiltInDataType: typeIdentifier = firstChild.FirstTerminalNode; break; default: if (String.Equals(dataTypeNode.Id, NonTerminals.AssociativeArrayIndexType)) { typeIdentifier = dataTypeNode.FirstTerminalNode; } break; } dataTypeReference = null; if (typeIdentifier == null) { return(false); } dataTypeReference = new OracleDataTypeReference { RootNode = dataTypeNode, Container = program, OwnerNode = ownerNode, ObjectNode = typeIdentifier }; ResolveTypeMetadata(dataTypeReference); program.DataTypeReferences.Add(dataTypeReference); return(true); }
public void VisitDataTypeReference(OracleDataTypeReference dataTypeReference) { if (TryBuildSchemaTooltip(dataTypeReference)) { return; } BuildSimpleToolTip(dataTypeReference.SchemaObject); }
public static OracleDataType ResolveDataTypeFromNode(StatementGrammarNode dataType) { var dataTypeReference = new OracleDataTypeReference { RootNode = dataType }; ResolveTypeMetadata(dataTypeReference); return(dataTypeReference.ResolvedDataType); }
public static void ResolveSchemaType(OracleDataTypeReference dataTypeReference) { var semanticModel = dataTypeReference.Container.SemanticModel; if (dataTypeReference.DatabaseLinkNode == null && semanticModel.HasDatabaseModel) { dataTypeReference.SchemaObject = semanticModel.DatabaseModel.GetFirstSchemaObject <OracleTypeBase>(semanticModel.DatabaseModel.GetPotentialSchemaObjectIdentifiers(dataTypeReference.FullyQualifiedObjectName)); } }
private static void TryResolveVarcharDetails(OracleDataTypeReference dataTypeReference, StatementGrammarNode definitionNode) { var varyingCharacterSimplePrecisionNode = definitionNode.GetSingleDescendant(NonTerminals.DataTypeVarcharSimplePrecision); var valueTerminal = varyingCharacterSimplePrecisionNode?[Terminals.IntegerLiteral]; if (valueTerminal == null) { return; } dataTypeReference.ResolvedDataType.Length = Convert.ToInt32(valueTerminal.Token.Value); dataTypeReference.LengthNode = valueTerminal; var byteOrCharNode = varyingCharacterSimplePrecisionNode[NonTerminals.ByteOrChar]; if (byteOrCharNode != null) { dataTypeReference.ResolvedDataType.Unit = byteOrCharNode.FirstTerminalNode.Id == Terminals.Byte ? DataUnit.Byte : DataUnit.Character; } }
public static OracleDataTypeReference CreateDataTypeReference(OracleQueryBlock queryBlock, OracleSelectListColumn selectListColumn, StatementPlacement placement, StatementGrammarNode typeIdentifier) { var dataTypeNode = typeIdentifier.ParentNode.ParentNode; var dataTypeReference = new OracleDataTypeReference { RootNode = dataTypeNode, Owner = queryBlock, Container = queryBlock, OwnerNode = dataTypeNode[NonTerminals.SchemaDatatype, NonTerminals.SchemaPrefix, Terminals.SchemaIdentifier], ObjectNode = typeIdentifier, DatabaseLinkNode = String.Equals(typeIdentifier.Id, Terminals.DataTypeIdentifier) ? GetDatabaseLinkFromIdentifier(typeIdentifier) : null, Placement = placement, SelectListColumn = selectListColumn }; ResolveTypeMetadata(dataTypeReference); ResolveSchemaType(dataTypeReference); return(dataTypeReference); }
private static void ResolveTypeMetadata(OracleDataTypeReference dataTypeReference) { var dataTypeNode = dataTypeReference.RootNode; var isSqlDataType = String.Equals(dataTypeNode.Id, NonTerminals.DataType); var isAssociativeArrayType = String.Equals(dataTypeNode.Id, NonTerminals.AssociativeArrayIndexType); if (!isSqlDataType && !String.Equals(dataTypeNode.Id, NonTerminals.PlSqlDataType) && !String.Equals(dataTypeNode.Id, NonTerminals.PlSqlDataTypeWithoutConstraint) && !isAssociativeArrayType) { throw new ArgumentException($"RootNode ID must be '{NonTerminals.DataType}' or '{NonTerminals.PlSqlDataType}' but is {dataTypeNode.Id}. ", nameof(dataTypeReference)); } var owner = String.Equals(dataTypeNode.FirstTerminalNode.Id, Terminals.SchemaIdentifier) ? dataTypeNode.FirstTerminalNode.Token.Value : String.Empty; var dataType = dataTypeReference.ResolvedDataType = new OracleDataType(); var builtInDataTypeNode = isAssociativeArrayType ? dataTypeNode : dataTypeNode[NonTerminals.BuiltInDataType]; string name; if (builtInDataTypeNode != null) { var isVarying = builtInDataTypeNode[Terminals.Varying] != null; switch (builtInDataTypeNode.FirstTerminalNode.Id) { case Terminals.Double: name = TerminalValues.BinaryDouble; break; case Terminals.Long: name = builtInDataTypeNode.ChildNodes.Count > 1 && String.Equals(builtInDataTypeNode.ChildNodes[1].Id, Terminals.Raw) ? "LONG RAW" : TerminalValues.Long; break; case Terminals.Interval: var yearToMonthNode = builtInDataTypeNode[NonTerminals.YearToMonthOrDayToSecond, NonTerminals.IntervalYearToMonth]; if (yearToMonthNode == null) { var dayToSecondNode = builtInDataTypeNode[NonTerminals.YearToMonthOrDayToSecond, NonTerminals.IntervalDayToSecond]; name = dayToSecondNode == null ? String.Empty : OracleDatabaseModelBase.BuiltInDataTypeIntervalDayToSecond; } else { name = OracleDatabaseModelBase.BuiltInDataTypeIntervalYearToMonth; } break; case Terminals.National: name = isVarying ? TerminalValues.NVarchar2 : TerminalValues.NChar; break; case Terminals.Character: name = isVarying ? TerminalValues.Varchar2 : TerminalValues.Char; break; default: name = ((OracleToken)builtInDataTypeNode.FirstTerminalNode.Token).UpperInvariantValue; break; } StatementGrammarNode precisionNode; if (String.Equals(name, OracleDatabaseModelBase.BuiltInDataTypeIntervalDayToSecond) || String.Equals(name, OracleDatabaseModelBase.BuiltInDataTypeIntervalYearToMonth)) { var intervalPrecisions = builtInDataTypeNode.GetDescendants(NonTerminals.DataTypeSimplePrecision).ToArray(); if (intervalPrecisions.Length > 0) { dataType.Precision = GetSimplePrecisionValue(intervalPrecisions[0], out precisionNode); dataTypeReference.PrecisionNode = precisionNode; if (intervalPrecisions.Length == 2) { dataType.Scale = GetSimplePrecisionValue(intervalPrecisions[1], out precisionNode); dataTypeReference.ScaleNode = precisionNode; } } } else { var simplePrecisionNode = builtInDataTypeNode.GetSingleDescendant(NonTerminals.DataTypeSimplePrecision); var precisionValue = GetSimplePrecisionValue(simplePrecisionNode, out precisionNode); switch (name) { case TerminalValues.Float: case TerminalValues.Timestamp: dataType.Precision = precisionValue; dataTypeReference.PrecisionNode = precisionNode; break; default: dataType.Length = precisionValue; dataTypeReference.LengthNode = precisionNode; break; } TryResolveVarcharDetails(dataTypeReference, builtInDataTypeNode); TryResolveNumericPrecisionAndScale(dataTypeReference, builtInDataTypeNode); } } else if (!isSqlDataType) { name = ((OracleToken)dataTypeNode.LastTerminalNode.Token).UpperInvariantValue; } else { var identifier = dataTypeNode[NonTerminals.SchemaDatatype, Terminals.DataTypeIdentifier]; name = identifier == null ? String.Empty : ((OracleToken)identifier.Token).UpperInvariantValue; } dataType.FullyQualifiedName = OracleObjectIdentifier.Create(owner, name); dataTypeReference.ResolvedDataType = dataType; }