Exemple #1
0
        private static KeyValuePair <OracleObjectIdentifier, OracleColumn> MapTableColumn(IDataRecord reader, Version version)
        {
            var dataTypeIdentifier = OracleObjectIdentifier.Create(QualifyStringObject(reader["DATA_TYPE_OWNER"]), QualifyStringObject(reader["DATA_TYPE"]));
            var dataType           =
                new OracleDataType
            {
                FullyQualifiedName = dataTypeIdentifier,
                Length             = Convert.ToInt32(reader["DATA_LENGTH"]),
                Precision          = OracleReaderValueConvert.ToInt32(reader["DATA_PRECISION"]),
                Scale = OracleReaderValueConvert.ToInt32(reader["DATA_SCALE"])
            };

            ResolveDataUnit(dataType, reader["CHAR_USED"]);

            var column =
                new OracleColumn
            {
                Name          = QualifyStringObject(reader["COLUMN_NAME"]),
                DataType      = dataType,
                Nullable      = String.Equals((string)reader["NULLABLE"], "Y"),
                Virtual       = String.Equals((string)reader["VIRTUAL_COLUMN"], "YES"),
                DefaultValue  = OracleReaderValueConvert.ToString(reader["DATA_DEFAULT"]),
                CharacterSize = Convert.ToInt32(reader["CHAR_LENGTH"]),
                UserGenerated = true
            };

            if (version.Major >= 12)
            {
                column.Hidden        = String.Equals((string)reader["HIDDEN_COLUMN"], "YES");
                column.UserGenerated = String.Equals((string)reader["USER_GENERATED"], "YES");
            }

            return(new KeyValuePair <OracleObjectIdentifier, OracleColumn>(
                       OracleObjectIdentifier.Create(QualifyStringObject(reader["OWNER"]), QualifyStringObject(reader["TABLE_NAME"])), column));
        }
Exemple #2
0
        private static OracleTypeCollection MapCollectionTypeAttributes(IDataRecord reader, IDictionary <OracleObjectIdentifier, OracleSchemaObject> allObjects)
        {
            var typeFullyQualifiedName = OracleObjectIdentifier.Create(QualifyStringObject(reader["OWNER"]), QualifyStringObject(reader["TYPE_NAME"]));

            if (!allObjects.TryGetValue(typeFullyQualifiedName, out OracleSchemaObject typeObject))
            {
                return(null);
            }

            var collectionType        = (OracleTypeCollection)typeObject;
            var elementTypeIdentifier = OracleObjectIdentifier.Create(QualifyStringObject(reader["ELEM_TYPE_OWNER"]), QualifyStringObject(reader["ELEM_TYPE_NAME"]));

            var dataType =
                new OracleDataType
            {
                FullyQualifiedName = elementTypeIdentifier,
                Length             = OracleReaderValueConvert.ToInt32(reader["LENGTH"]),
                Precision          = OracleReaderValueConvert.ToInt32(reader["PRECISION"]),
                Scale = OracleReaderValueConvert.ToInt32(reader["SCALE"])
            };

            ResolveDataUnit(dataType, reader["CHARACTER_SET_NAME"]);

            collectionType.ElementDataType = dataType;
            collectionType.CollectionType  = (string)reader["COLL_TYPE"] == OracleTypeCollection.OracleCollectionTypeNestedTable ? OracleCollectionType.Table : OracleCollectionType.VarryingArray;
            collectionType.UpperBound      = OracleReaderValueConvert.ToInt32(reader["UPPER_BOUND"]);

            return(collectionType);
        }
Exemple #3
0
        private static OracleTypeObject MapTypeAttributes(IDataRecord reader, IDictionary <OracleObjectIdentifier, OracleSchemaObject> allObjects)
        {
            var typeFullyQualifiedName = OracleObjectIdentifier.Create(QualifyStringObject(reader["OWNER"]), QualifyStringObject(reader["TYPE_NAME"]));

            if (!allObjects.TryGetValue(typeFullyQualifiedName, out OracleSchemaObject typeObject))
            {
                return(null);
            }

            var type = (OracleTypeObject)typeObject;
            var attributeTypeIdentifier = OracleObjectIdentifier.Create(QualifyStringObject(reader["ATTR_TYPE_OWNER"]), QualifyStringObject(reader["ATTR_TYPE_NAME"]));

            var dataType =
                new OracleDataType
            {
                FullyQualifiedName = attributeTypeIdentifier,
                Length             = OracleReaderValueConvert.ToInt32(reader["LENGTH"]),
                Precision          = OracleReaderValueConvert.ToInt32(reader["PRECISION"]),
                Scale = OracleReaderValueConvert.ToInt32(reader["SCALE"])
            };

            ResolveDataUnit(dataType, reader["CHAR_USED"]);

            var attribute =
                new OracleTypeAttribute
            {
                Name        = QualifyStringObject(reader["ATTR_NAME"]),
                DataType    = dataType,
                IsInherited = String.Equals((string)reader["INHERITED"], "YES")
            };

            type.Attributes.Add(attribute);

            return(type);
        }
Exemple #4
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));
                }
            }
        }
Exemple #5
0
 public static DbParameter GetDbParameter(string name, OracleDataType dataType, int length)
 {
     switch (dataType)
     {
         case OracleDataType.Varchar2:
             return new OracleParameter(name, OracleDbType.Varchar2, length);
         case OracleDataType.Nvarchar2:
             return new OracleParameter(name, OracleDbType.NVarchar2, length);
         case OracleDataType.Int32:
             return new OracleParameter(name, OracleDbType.Int32);
         case OracleDataType.Char:
             return new OracleParameter(name, OracleDbType.Char, length);
         case OracleDataType.Date:
             return new OracleParameter(name, OracleDbType.Date);
     }
     return null;
 }
        public OracleColumnDataTypeDescriptor(OracleDataType typeSpecifier, int quantity)
        {
            switch (typeSpecifier)
            {
            case OracleDataType.BLOB:
                throw new ArgumentException("ERROR: quantity specificied for a data type that does not require it.");

            //break;
            case OracleDataType.CHAR:
                throw new NotImplementedException();

            //break;
            case OracleDataType.CLOB:
                throw new ArgumentException("ERROR: quantity specificied for a data type that does not require it.");

            //break;
            case OracleDataType.DATE:
                throw new ArgumentException("ERROR: quantity specificied for a data type that does not require it.");

            //break;
            case OracleDataType.NCHAR:
                throw new NotImplementedException();

            //break;
            case OracleDataType.NCLOB:
                throw new NotImplementedException();

            //break;
            case OracleDataType.NUMBER:
                throw new ArgumentException("ERROR: insufficient quantity specification for this data type.");

            //break;
            case OracleDataType.NVARCHAR2:
                throw new NotImplementedException();

            //break;
            case OracleDataType.TIMESTAMP:
                throw new ArgumentException("ERROR: quantity specificied for a data type that does not require it.");

            //break;
            case OracleDataType.VARCHAR2:
                throw new NotImplementedException();
                //break;
            }
        }
Exemple #7
0
 /// <summary>
 /// Преобразует строку в тип OracleDbType
 /// </summary>
 /// <param name="value">Значение</param>
 /// <param name="type">Тип</param>
 /// <returns></returns>
 public static Object StrAsOraValue(String value, OracleDataType type) {
   return StrAsOraValue(value, (OracleDbType)type);
 }
Exemple #8
0
        protected override IReadOnlyList <OracleColumn> BuildPseudocolumns()
        {
            var pseudocolumns = new List <OracleColumn>();
            var table         = SchemaObject.GetTargetSchemaObject() as OracleTable;

            if (Type != ReferenceType.SchemaObject || table == null)
            {
                return(pseudocolumns.AsReadOnly());
            }

            if (table.Organization == OrganizationType.Heap || table.Organization == OrganizationType.Index)
            {
                var rowIdPseudocolumn =
                    new OracleColumn(true)
                {
                    Name     = RowIdNormalizedName,
                    DataType =
                        new OracleDataType
                    {
                        FullyQualifiedName = OracleObjectIdentifier.Create(null, table.Organization == OrganizationType.Index ? TerminalValues.UniversalRowId : TerminalValues.RowIdDataType)
                    }
                };

                pseudocolumns.Add(rowIdPseudocolumn);
            }

            if (FlashbackOption == FlashbackOption.None || FlashbackOption == FlashbackOption.AsOf)
            {
                var rowSystemChangeNumberPseudocolumn =
                    new OracleColumn(true)
                {
                    Name     = "\"ORA_ROWSCN\"",
                    DataType = OracleDataType.NumberType
                };

                pseudocolumns.Add(rowSystemChangeNumberPseudocolumn);
            }
            else if ((FlashbackOption & FlashbackOption.Versions) == FlashbackOption.Versions)
            {
                var flashbackVersionColumns =
                    new[]
                {
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_STARTTIME\"",
                        DataType = OracleDataType.CreateTimestampDataType(0)
                    },
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_ENDTIME\"",
                        DataType = OracleDataType.CreateTimestampDataType(0)
                    },
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_STARTSCN\"",
                        DataType = OracleDataType.NumberType
                    },
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_ENDSCN\"",
                        DataType = OracleDataType.NumberType
                    },
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_OPERATION\"",
                        DataType = new OracleDataType {
                            FullyQualifiedName = OracleObjectIdentifier.Create(null, TerminalValues.Varchar2), Unit = DataUnit.Byte, Length = 1
                        }
                    },
                    new OracleColumn(true)
                    {
                        Name     = "\"VERSIONS_XID\"",
                        DataType = new OracleDataType {
                            FullyQualifiedName = OracleObjectIdentifier.Create(null, TerminalValues.Raw), Length = 8
                        }
                    }
                };

                pseudocolumns.AddRange(flashbackVersionColumns);
            }

            return(pseudocolumns.AsReadOnly());
        }
        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);
        }
Exemple #10
0
		protected override IReadOnlyList<OracleColumn> BuildColumns()
		{
			var columns = new List<OracleColumn>();
			var pivotColumns = new List<OracleSelectListColumn>();

			var pivotForColumnList = PivotClause[NonTerminals.PivotForClause, NonTerminals.IdentifierOrParenthesisEnclosedIdentifierList];
			if (pivotForColumnList != null)
			{
				var aggregatedColumnNames =
					SourceReferenceContainer.ColumnReferences
						.Where(c => AggregateFunctions.Any(f => f.SourcePosition.Contains(c.RootNode.SourcePosition)))
						.Select(c => c.NormalizedName);

				var groupingColumns = pivotForColumnList
					.GetDescendants(Terminals.Identifier)
					.Select(i => i.Token.Value.ToQuotedIdentifier())
					.Concat(aggregatedColumnNames)
					.ToHashSet();

				switch (PivotClause.Id)
				{
					case NonTerminals.PivotClause:
						var sourceColumns = SourceReference.Columns
							.Where(c => !groupingColumns.Contains(c.Name))
							.Select(c => c.Clone());

						columns.AddRange(sourceColumns);

						var withXmlTransformation = PivotClause[Terminals.Xml] != null;
						if (withXmlTransformation)
						{
							var xmlColumnName = String.Join("_", groupingColumns.Select(c => c.Trim('"')));
							if (xmlColumnName.Length > 26)
							{
								xmlColumnName = xmlColumnName.Substring(0, 26);
							}

							var xmlColumn =
								new OracleColumn
								{
									Name = $"\"{xmlColumnName}_XML\"",
									DataType = OracleDataType.XmlType,
									Nullable = true
								};

							columns.Add(xmlColumn);
						}
						else
						{
							pivotColumns.AddRange(ResolvePivotColumns());
							columns.AddRange(pivotColumns.Select(c => c.ColumnDescription));
						}

						break;

					case NonTerminals.UnpivotClause:
						var unpivotColumnSources = new List<StatementGrammarNode>();
						var unpivotedColumns = new HashSet<string>();
						var unpivotColumnSelectorValues = new List<StatementGrammarNode>();
						var columnTransformations = PivotClause[NonTerminals.UnpivotInClause].GetDescendants(NonTerminals.UnpivotValueToColumnTransformationList);
						var groupingColumnsNullable = false;
						foreach (var columnTransformation in columnTransformations)
						{
							unpivotedColumns.UnionWith(columnTransformation.GetDescendants(Terminals.Identifier).Select(t => t.Token.Value.ToQuotedIdentifier()));
							var columnSelectorValue = columnTransformation[NonTerminals.UnpivotValueSelector, NonTerminals.NullOrStringOrNumberLiteralOrParenthesisEnclosedStringOrIntegerLiteralList];
							if (columnSelectorValue != null)
							{
								unpivotColumnSelectorValues.Add(columnSelectorValue);
								groupingColumnsNullable |= columnSelectorValue.TerminalCount == 1 || String.Equals(columnSelectorValue.FirstTerminalNode.Id, Terminals.Null);
							}

							unpivotColumnSources.AddIfNotNull(columnTransformation[NonTerminals.IdentifierOrParenthesisEnclosedIdentifierList]);
						}

						var unpivotColumnDataTypes = OracleDataType.FromUnpivotColumnSelectorValues(unpivotColumnSelectorValues);
						AreUnpivotColumnSelectorValuesValid = unpivotColumnDataTypes != null;

						UnpivotColumnSelectorValues = unpivotColumnSelectorValues.AsReadOnly();
						UnpivotColumnSources = unpivotColumnSources.AsReadOnly();

						columns.AddRange(SourceReference.Columns
							.Where(c => !unpivotedColumns.Contains(c.Name))
							.Select(c => c.Clone()));

						columns.AddRange(groupingColumns.Select(
							(c, i) =>
								new OracleColumn
								{
									Name = c,
									Nullable = groupingColumnsNullable,
									DataType = groupingColumns.Count == unpivotColumnDataTypes?.Count
										? unpivotColumnDataTypes[i]
										: OracleDataType.Empty
								}));

						var unpivotColumnsNullable = PivotClause[NonTerminals.UnpivotNullsClause, NonTerminals.IncludeOrExclude, Terminals.Include] != null;
						var unpivotColumns = PivotClause[NonTerminals.IdentifierOrParenthesisEnclosedIdentifierList].GetDescendants(Terminals.Identifier);
						columns.AddRange(
							unpivotColumns.Select(
								i => new OracleColumn
								{
									Name = i.Token.Value.ToQuotedIdentifier(),
									DataType = OracleDataType.Empty,
									Nullable = unpivotColumnsNullable
								}));

						break;
				}
			}

			PivotColumns = pivotColumns.AsReadOnly();

			return columns.AsReadOnly();
		}
Exemple #11
0
 private static void ResolveDataUnit(OracleDataType dataType, object characterUsedValue)
 {
     dataType.Unit = !dataType.FullyQualifiedName.HasOwner && dataType.FullyQualifiedName.NormalizedName.In("\"VARCHAR\"", "\"VARCHAR2\"")
                         ? String.Equals((string)characterUsedValue, "C") ? DataUnit.Character : DataUnit.Byte
                         : DataUnit.NotApplicable;
 }
        public void VisitPlSqlVariableReference(OraclePlSqlVariableReference variableReference)
        {
            if (variableReference.Variables.Count != 1)
            {
                return;
            }

            var element      = variableReference.Variables.First();
            var labelBuilder = new ToolTipLabelBuilder();

            var elementTypeName = element.GetType().Name;
            var elementName     = $"{element.Name.ToSimpleIdentifier()}:";

            switch (elementTypeName)
            {
            case nameof(OraclePlSqlParameter):
                var parameter = (OraclePlSqlParameter)element;
                labelBuilder.AddElement("Parameter");
                labelBuilder.AddElement(elementName);
                labelBuilder.AddElement(GetDataTypeFromNode(parameter));
                labelBuilder.AddElement("NULL");
                labelBuilder.AddElement(GetDefaultExpression(variableReference.PlSqlProgram, parameter), "= ");
                break;

            case nameof(OraclePlSqlVariable):
                var variable = (OraclePlSqlVariable)element;
                labelBuilder.AddElement(variable.IsConstant ? "Constant" : "Variable");
                labelBuilder.AddElement(elementName);
                var dataTypeName = variable.DataType == null?GetDataTypeFromNode(variable) : OracleDataType.ResolveFullTypeName(variable.DataType);

                labelBuilder.AddElement(dataTypeName);
                labelBuilder.AddElement(variable.Nullable ? "NULL" : "NOT NULL");
                labelBuilder.AddElement(GetDefaultExpression(variableReference.PlSqlProgram, variable), "= ");
                break;

            case nameof(OraclePlSqlType):
                labelBuilder.AddElement("Type");
                labelBuilder.AddElement(elementName);
                break;

            case nameof(OraclePlSqlCursorVariable):
                var cursor = (OraclePlSqlCursorVariable)element;

                if (variableReference.ObjectNode != null && variableReference.IdentifierNode == _terminal)
                {
                    labelBuilder.AddElement("Cursor column");

                    var columns           = cursor.SemanticModel?.MainQueryBlock?.NamedColumns[variableReference.NormalizedName].ToArray();
                    var columnName        = variableReference.NormalizedName.ToSimpleIdentifier();
                    var columnNameAndType = columns != null && columns.Length == 1 && !String.IsNullOrEmpty(columns[0].ColumnDescription.FullTypeName)
                                                        ? $"{columnName}: {columns[0].ColumnDescription.FullTypeName}"
                                                        : columnName;

                    labelBuilder.AddElement($"{cursor.Name.ToSimpleIdentifier()}.{columnNameAndType}");
                }
                else
                {
                    labelBuilder.AddElement(cursor.IsImplicit ? "Implicit cursor" : "Cursor");
                    labelBuilder.AddElement(elementName);

                    if (cursor.SemanticModel != null)
                    {
                        var queryText = cursor.SemanticModel.Statement.RootNode.GetText(variableReference.Container.SemanticModel.StatementText);
                        labelBuilder.AddElement(queryText);
                    }
                }

                break;
            }

            ToolTip = new ToolTipObject {
                DataContext = labelBuilder.ToString()
            };
        }