示例#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));
        }
        public void VisitColumnReference(OracleColumnReference columnReference)
        {
            var matchedColumns = columnReference.ValidObjectReference?.Columns.Where(c => String.Equals(columnReference.NormalizedName, c.Name)).ToArray();

            if (matchedColumns?.Length != 1)
            {
                return;
            }

            var dataType = matchedColumns[0].DataType;

            if (dataType.IsDynamicCollection)
            {
                _columns.Add(OracleColumn.BuildColumnValueColumn(OracleDataType.Empty));
            }
            else
            {
                var semanticModel = columnReference.Owner.SemanticModel;
                if (semanticModel.HasDatabaseModel)
                {
                    var schemaObject = semanticModel.DatabaseModel.GetFirstSchemaObject <OracleTypeCollection>(dataType.FullyQualifiedName);
                    if (schemaObject != null)
                    {
                        _columns.Add(OracleColumn.BuildColumnValueColumn(((OracleTypeCollection)schemaObject).ElementDataType));
                    }
                }
            }
        }
 public void VisitTypeReference(OracleTypeReference typeReference)
 {
     if (typeReference.SchemaObject.GetTargetSchemaObject() is OracleTypeCollection collectionType)
     {
         _columns.Add(OracleColumn.BuildColumnValueColumn(collectionType.ElementDataType));
     }
 }
示例#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));
                }
            }
        }
示例#5
0
        private void SetColumns(OracleTableSchema oracleTable)
        {
            if (oracleTable == null)
            {
                return;
            }
            oracleTable.Columns = new ColumnCollection();
            string          sql     = @"SELECT TC.COLUMN_NAME,
       TC.DATA_TYPE,
       NVL(DECODE(TC.CHAR_LENGTH,0,TC.DATA_PRECISION,TC.CHAR_LENGTH),TC.DATA_LENGTH) AS DATA_LENGTH,
       TC.DATA_PRECISION,
       NVL(TC.DATA_SCALE, -1) DATA_SCALE,
       TC.NULLABLE,
       TC.DATA_DEFAULT,
       CC.COMMENTS
  FROM USER_TAB_COLUMNS TC
  LEFT JOIN USER_COL_COMMENTS CC
    ON TC.COLUMN_NAME = CC.COLUMN_NAME
   AND TC.TABLE_NAME = CC.TABLE_NAME
   WHERE TC.TABLE_NAME=:TABLE_NAME ORDER BY TC.COLUMN_ID ASC";
            List <IColumn>  columns = new List <IColumn>();
            OracleParameter para    = new OracleParameter("TABLE_NAME", oracleTable.Name);
            DbHelper        helper  = new DbHelper(this._connectionString);
            var             table   = helper.ListBySql(sql, para);

            foreach (DataRow row in table.Rows)
            {
                int          scale     = Convert.ToInt32(row["DATA_SCALE"]);
                string       data_type = row["DATA_TYPE"] + string.Empty;
                OracleColumn column    = new OracleColumn
                {
                    Name         = row["COLUMN_NAME"] + string.Empty,
                    Comment      = row["COMMENTS"] + string.Empty,
                    CsharpType   = OracleUtils.TransformDatabaseType(data_type, scale),
                    DbType       = data_type,
                    DefaultValue = (row["DATA_DEFAULT"] + string.Empty).Trim('\r', '\n'),
                    IsNullable   = (row["NULLABLE"] + string.Empty) == "Y",
                    Length       = Convert.ToInt32(row["DATA_LENGTH"]),
                    Scale        = scale,
                    Table        = oracleTable,
                    IsNumeric    = OracleUtils.IsNumeric(data_type)
                };
                oracleTable.Columns.Add(column);
            }
        }
示例#6
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
            });
        }
示例#7
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);
        }
示例#9
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();
		}
        public void VisitProgramReference(OracleProgramReference programReference)
        {
            var programMetadata = programReference.Metadata;
            var semanticModel   = programReference.Owner.SemanticModel;

            if (programMetadata == null || !semanticModel.HasDatabaseModel)
            {
                return;
            }

            if (programReference.ParameterReferences.Count == 2 && programMetadata.Identifier == OracleProgramIdentifier.IdentifierBuiltInProgramCast)
            {
                var dataTypeNode      = programReference.ParameterReferences[1].ParameterNode;
                var dataTypeReference = programReference.Container.DataTypeReferences.SingleOrDefault(dt => dt.RootNode == dataTypeNode);
                if (dataTypeReference?.SchemaObject.GetTargetSchemaObject() is OracleTypeCollection collectionType)
                {
                    _columns.Add(OracleColumn.BuildColumnValueColumn(collectionType.ElementDataType));
                }
            }

            if (programMetadata.Parameters.Count <= 1)
            {
                return;
            }

            var dataTypeType = programMetadata.Parameters[0].DataType;

            if (!String.Equals(dataTypeType, OracleTypeCollection.OracleCollectionTypeNestedTable) && !String.Equals(dataTypeType, OracleTypeCollection.OracleCollectionTypeVarryingArray))
            {
                return;
            }

            var returnParameter = programMetadata.Parameters.SingleOrDefault(p => p.Direction == ParameterDirection.ReturnValue && p.DataLevel == 1 && p.Position == 1);

            if (returnParameter == null)
            {
                return;
            }

            OracleSchemaObject schemaObject;

            if (String.Equals(returnParameter.DataType, OracleTypeBase.TypeCodeObject))
            {
                if (semanticModel.DatabaseModel.AllObjects.TryGetValue(returnParameter.CustomDataType, out schemaObject))
                {
                    var attributeColumns = ((OracleTypeObject)schemaObject).Attributes
                                           .Select(a =>
                                                   new OracleColumn
                    {
                        DataType = a.DataType,
                        Nullable = true,
                        Name     = a.Name
                    });

                    _columns.AddRange(attributeColumns);
                }
            }
            else if (semanticModel.DatabaseModel.AllObjects.TryGetValue(programMetadata.Parameters[0].CustomDataType, out schemaObject))
            {
                _columns.Add(OracleColumn.BuildColumnValueColumn(((OracleTypeCollection)schemaObject).ElementDataType));
            }
        }
 private object ExecuteScalarInternal(bool needCLStype, bool needRowid, out OciRowidDescriptor rowidDescriptor)
 {
     OciStatementHandle statementHandle = null;
     object oracleValue = null;
     int rc = 0;
     try
     {
         statementHandle = this.GetStatementHandle();
         ArrayList resultParameterOrdinals = new ArrayList();
         this.Execute(statementHandle, CommandBehavior.Default, needRowid, out rowidDescriptor, out resultParameterOrdinals);
         if (OCI.STMT.OCI_STMT_SELECT != this._statementType)
         {
             return oracleValue;
         }
         OracleColumn column = new OracleColumn(statementHandle, 0, this.ErrorHandle, this._connection);
         int offset = 0;
         bool success = false;
         bool mustRelease = false;
         SafeHandle handleToBind = null;
         column.Describe(ref offset, this._connection, this.ErrorHandle);
         NativeBuffer_RowBuffer buffer = new NativeBuffer_RowBuffer(offset, 1);
         RuntimeHelpers.PrepareConstrainedRegions();
         try
         {
             buffer.DangerousAddRef(ref success);
             column.Bind(statementHandle, buffer, this.ErrorHandle, 0);
             column.Rebind(this._connection, ref mustRelease, ref handleToBind);
             rc = TracedNativeMethods.OCIStmtFetch(statementHandle, this.ErrorHandle, 1, OCI.FETCH.OCI_FETCH_NEXT, OCI.MODE.OCI_DEFAULT);
             if (100 != rc)
             {
                 if (rc != 0)
                 {
                     this.Connection.CheckError(this.ErrorHandle, rc);
                 }
                 if (needCLStype)
                 {
                     oracleValue = column.GetValue(buffer);
                 }
                 else
                 {
                     oracleValue = column.GetOracleValue(buffer);
                 }
             }
         }
         finally
         {
             if (mustRelease)
             {
                 handleToBind.DangerousRelease();
             }
             if (success)
             {
                 buffer.DangerousRelease();
             }
         }
         GC.KeepAlive(column);
     }
     finally
     {
         if (statementHandle != null)
         {
             this.ReleaseStatementHandle(statementHandle);
         }
     }
     return oracleValue;
 }