Ejemplo n.º 1
0
		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
				};
		}
Ejemplo n.º 2
0
		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;
		}
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
		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;
		}