Fix getting readonly column metadata
authorv-kaywon <v-kaywon@microsoft.com>
Fri, 25 Oct 2019 19:08:24 +0000 (12:08 -0700)
committerv-kaywon <v-kaywon@microsoft.com>
Fri, 25 Oct 2019 19:08:24 +0000 (12:08 -0700)
Commit migrated from https://github.com/dotnet/corefx/commit/d162452c75d4e63063f3441f9e746d752ed1173d

src/libraries/System.Data.SqlClient/src/System/Data/SqlClient/TdsParserHelperClasses.cs
src/libraries/System.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs

index 056d6bbcb03b6cd2f062d6ba42f93a3d7e9bd57d..f8e3f6ecd8c313e18391da48392ee4ec8fd0913d 100644 (file)
@@ -341,7 +341,7 @@ namespace System.Data.SqlClient
             IsIdentity = 1 << 6,
             IsColumnSet = 1 << 7,
 
-            IsReadOnlyMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
+            IsUpdatableMask = (Updatable | UpdateableUnknown) // two bit field (0 is read only, 1 is updatable, 2 is updatability unknown)
         }
 
         internal string column;
@@ -391,13 +391,13 @@ namespace System.Data.SqlClient
 
         public byte Updatability
         {
-            get => (byte)(flags & _SqlMetadataFlags.IsReadOnlyMask);
+            get => (byte)(flags & _SqlMetadataFlags.IsUpdatableMask);
             set => flags = (_SqlMetadataFlags)((value & 0x3) | ((int)flags & ~0x03));
         }
 
         public bool IsReadOnly
         {
-            get => flags.HasFlag(_SqlMetadataFlags.IsReadOnlyMask);
+            get => (flags & _SqlMetadataFlags.IsUpdatableMask) == 0;
         }
 
         public bool IsDifferentName
index a91f0f9447469e682a9fca94a161f48419cbebf4..d76838a832b4fdc5e16ff802668b5ac477a7e8e4 100644 (file)
@@ -7,6 +7,7 @@ using System.Globalization;
 using System.Text;
 using System.Reflection;
 using System.Collections;
+using System.Collections.Generic;
 using System.Diagnostics;
 using Xunit;
 
@@ -1243,6 +1244,52 @@ namespace System.Data.SqlClient.ManualTesting.Tests
             }
         }
 
+        [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
+        public void TestReadOnlyColumnMetadata()
+        {
+            using (SqlConnection connection = new SqlConnection(DataTestUtility.TcpConnStr))
+            {
+                connection.Open();
+                using (SqlCommand command = connection.CreateCommand())
+                {
+                    command.CommandText = "Create table #t (ID int identity(1,1), sText varchar(12), sMemo as (convert(varchar,ID) + ' ' + sText))";
+                    command.ExecuteNonQuery();
+                }
+                using (SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from #t", connection))
+                {
+                    using (SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter))
+                    {
+                        using (SqlCommand cmd = commandBuilder.GetInsertCommand())
+                        {
+                            DataTestUtility.AssertEqualsWithDescription("INSERT INTO [#t] ([sText]) VALUES (@p1)", cmd.CommandText, "Unexpected insert command.");
+                        }
+                    }
+
+                    using (DataTable dataTable = new DataTable())
+                    {
+                        dataAdapter.FillSchema(dataTable, SchemaType.Mapped);
+                        Dictionary<string, bool> expAutoIncrement = new Dictionary<string, bool>()
+                        {
+                            {"ID", true},
+                            {"sText", false},
+                            {"sMemo", false}
+                        };
+                        Dictionary<string, bool> expReadOnly = new Dictionary<string, bool>()
+                        {
+                            {"ID", true},
+                            {"sText", false},
+                            {"sMemo", true}
+                        };
+                        foreach (DataColumn dataColumn in dataTable.Columns)
+                        {
+                            DataTestUtility.AssertEqualsWithDescription(dataColumn.AutoIncrement, expAutoIncrement[dataColumn.ColumnName], "Unexpected AutoIncrement metadata.");
+                            DataTestUtility.AssertEqualsWithDescription(dataColumn.ReadOnly, expReadOnly[dataColumn.ColumnName], "Unexpected ReadOnly metadata.");
+                        }
+                    }
+                }
+            }
+        }
+
         #region Utility_Methods
         private void CheckParameters(SqlCommand cmd, string expectedResults)
         {