Exemple #1
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);
        }