Skip to content

Commit eea4cf4

Browse files
Merge pull request #654 from ngbrown/NH-4043
NH-4043 - Complete keyword registration in dialects.
2 parents 38ead3f + 0ad0ba1 commit eea4cf4

24 files changed

+1365
-143
lines changed

src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/HeavyEntity.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ public class Order
77
public string And { get; set; }
88
public string Column { get; set; }
99
public string Name { get; set; }
10+
public string Abracadabra { get; set; }
1011
}
1112
}

src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/HeavyEntity.hbm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<property name="And"/>
1414
<property name="Column"/>
1515
<property name="Name"/>
16+
<property name="Abracadabra"/>
1617
</class>
1718

1819
</hibernate-mapping>

src/NHibernate.Test/Tools/hbm2ddl/SchemaMetadataUpdaterTest/SchemaMetadataUpdaterFixture.cs

Lines changed: 111 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
3-
using NHibernate.Cfg;
4+
using NHibernate.Dialect;
5+
using NHibernate.Driver;
46
using NHibernate.Engine;
57
using NHibernate.Mapping;
68
using NHibernate.Tool.hbm2ddl;
79
using NUnit.Framework;
10+
using Environment = NHibernate.Cfg.Environment;
811

912
namespace NHibernate.Test.Tools.hbm2ddl.SchemaMetadataUpdaterTest
1013
{
@@ -23,8 +26,8 @@ public void CanRetrieveReservedWords()
2326
var metaData = dialect.GetDataBaseSchema(connectionHelper.Connection);
2427
var reserved = metaData.GetReservedWords();
2528
Assert.That(reserved, Is.Not.Empty);
26-
Assert.That(reserved, Has.Member("SELECT"));
27-
Assert.That(reserved, Has.Member("FROM"));
29+
Assert.That(reserved, Has.Member("SELECT").IgnoreCase);
30+
Assert.That(reserved, Has.Member("FROM").IgnoreCase);
2831
}
2932
finally
3033
{
@@ -35,7 +38,7 @@ public void CanRetrieveReservedWords()
3538
[Test]
3639
public void UpdateReservedWordsInDialect()
3740
{
38-
var reservedDb = new HashSet<string>();
41+
var reservedDb = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
3942
var configuration = TestConfigurationHelper.GetDefaultConfiguration();
4043
var dialect = Dialect.Dialect.GetDialect(configuration.Properties);
4144
var connectionHelper = new ManagedProviderConnectionHelper(configuration.Properties);
@@ -55,25 +58,118 @@ public void UpdateReservedWordsInDialect()
5558

5659
var sf = (ISessionFactoryImplementor) configuration.BuildSessionFactory();
5760
SchemaMetadataUpdater.Update(sf);
58-
var match = reservedDb.Intersect(sf.Dialect.Keywords);
61+
var match = reservedDb.Intersect(sf.Dialect.Keywords, StringComparer.OrdinalIgnoreCase);
62+
63+
// tests that nothing in the first metaData.GetReservedWords() is left out of the second metaData.GetReservedWords() call.
64+
// i.e. always passes.
65+
Assert.That(match, Is.EquivalentTo(reservedDb));
66+
}
67+
68+
[Test]
69+
public void EnsureReservedWordsHardCodedInDialect()
70+
{
71+
var reservedDb = new HashSet<string>();
72+
var configuration = TestConfigurationHelper.GetDefaultConfiguration();
73+
var dialect = Dialect.Dialect.GetDialect(configuration.Properties);
74+
var connectionHelper = new ManagedProviderConnectionHelper(configuration.Properties);
75+
connectionHelper.Prepare();
76+
try
77+
{
78+
var metaData = dialect.GetDataBaseSchema(connectionHelper.Connection);
79+
foreach (var rw in metaData.GetReservedWords())
80+
{
81+
if (rw.Contains(" ")) continue;
82+
reservedDb.Add(rw.ToLowerInvariant());
83+
}
84+
}
85+
finally
86+
{
87+
connectionHelper.Release();
88+
}
89+
90+
var sf = (ISessionFactoryImplementor)configuration.BuildSessionFactory();
91+
92+
// use the dialect as configured, with no update
93+
var match = reservedDb.Intersect(sf.Dialect.Keywords).ToList();
94+
95+
// tests that nothing in metaData.GetReservedWords() is left out of the Dialect.Keywords (without a refresh).
96+
var differences = reservedDb.Except(match).ToList();
97+
if (differences.Count > 0)
98+
{
99+
Console.WriteLine("Update Dialect {0} with RegisterKeyword:", sf.Dialect.GetType().Name);
100+
foreach (var keyword in differences.OrderBy(x => x))
101+
{
102+
Console.WriteLine(" RegisterKeyword(\"{0}\");", keyword);
103+
}
104+
}
105+
106+
if (sf.ConnectionProvider.Driver is OdbcDriver)
107+
{
108+
Assert.Inconclusive("ODBC has excess keywords reserved");
109+
}
110+
59111
Assert.That(match, Is.EquivalentTo(reservedDb));
60112
}
61113

114+
[Test, Explicit]
115+
public void CheckForExcessReservedWordsHardCodedInDialect()
116+
{
117+
var reservedDb = new HashSet<string>();
118+
var configuration = TestConfigurationHelper.GetDefaultConfiguration();
119+
var dialect = Dialect.Dialect.GetDialect(configuration.Properties);
120+
var connectionHelper = new ManagedProviderConnectionHelper(configuration.Properties);
121+
connectionHelper.Prepare();
122+
try
123+
{
124+
var metaData = dialect.GetDataBaseSchema(connectionHelper.Connection);
125+
foreach (var rw in metaData.GetReservedWords())
126+
{
127+
reservedDb.Add(rw.ToLowerInvariant());
128+
}
129+
}
130+
finally
131+
{
132+
connectionHelper.Release();
133+
}
134+
135+
var sf = (ISessionFactoryImplementor)configuration.BuildSessionFactory();
136+
137+
// use the dialect as configured, with no update
138+
// tests that nothing in Dialect.Keyword is not in metaData.GetReservedWords()
139+
var differences = sf.Dialect.Keywords.Except(reservedDb).Except(AnsiSqlKeywords.Sql2003).ToList();
140+
if (differences.Count > 0)
141+
{
142+
Console.WriteLine("Excess RegisterKeyword in Dialect {0}:", sf.Dialect.GetType().Name);
143+
foreach (var keyword in differences.OrderBy(x => x))
144+
{
145+
Console.WriteLine(" RegisterKeyword(\"{0}\");", keyword);
146+
}
147+
}
148+
149+
// Don't fail incase the driver returns nothing.
150+
// This is an info-only test.
151+
}
152+
62153
[Test]
63154
public void ExplicitAutoQuote()
64155
{
65156
var configuration = TestConfigurationHelper.GetDefaultConfiguration();
66157
configuration.AddResource("NHibernate.Test.Tools.hbm2ddl.SchemaMetadataUpdaterTest.HeavyEntity.hbm.xml",
67158
GetType().Assembly);
68159

69-
SchemaMetadataUpdater.QuoteTableAndColumns(configuration);
160+
var dialect = Dialect.Dialect.GetDialect(configuration.GetDerivedProperties());
161+
dialect.Keywords.Add("Abracadabra");
162+
163+
SchemaMetadataUpdater.Update(configuration, dialect);
164+
SchemaMetadataUpdater.QuoteTableAndColumns(configuration, dialect);
70165

71166
var cm = configuration.GetClassMapping(typeof(Order));
72167
Assert.That(cm.Table.IsQuoted);
73168
var culs = new List<Column>(cm.Table.ColumnIterator);
74169
Assert.That(GetColumnByName(culs, "From").IsQuoted);
75170
Assert.That(GetColumnByName(culs, "And").IsQuoted);
76171
Assert.That(GetColumnByName(culs, "Select").IsQuoted);
172+
Assert.That(GetColumnByName(culs, "Abracadabra").IsQuoted);
77173
Assert.That(!GetColumnByName(culs, "Name").IsQuoted);
78174
}
79175

@@ -97,7 +193,7 @@ public void AutoQuoteTableAndColumnsAtStratup()
97193
[Test]
98194
public void AutoQuoteTableAndColumnsAtStratupIncludeKeyWordsImport()
99195
{
100-
var reservedDb = new HashSet<string>();
196+
var reservedDb = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
101197
var configuration = TestConfigurationHelper.GetDefaultConfiguration();
102198
var dialect = Dialect.Dialect.GetDialect(configuration.Properties);
103199
var connectionHelper = new ManagedProviderConnectionHelper(configuration.Properties);
@@ -119,8 +215,8 @@ public void AutoQuoteTableAndColumnsAtStratupIncludeKeyWordsImport()
119215
configuration.AddResource("NHibernate.Test.Tools.hbm2ddl.SchemaMetadataUpdaterTest.HeavyEntity.hbm.xml",
120216
GetType().Assembly);
121217
var sf = (ISessionFactoryImplementor)configuration.BuildSessionFactory();
122-
var match = reservedDb.Intersect(sf.Dialect.Keywords);
123-
Assert.That(match, Is.EquivalentTo(reservedDb));
218+
var match = reservedDb.Intersect(sf.Dialect.Keywords, StringComparer.OrdinalIgnoreCase);
219+
Assert.That(match, Is.EquivalentTo(reservedDb).IgnoreCase);
124220
}
125221

126222
private static Column GetColumnByName(IEnumerable<Column> columns, string colName)
@@ -167,14 +263,19 @@ public void WhenConfiguredOnlyExplicitAutoQuote()
167263
configuration.AddResource("NHibernate.Test.Tools.hbm2ddl.SchemaMetadataUpdaterTest.HeavyEntity.hbm.xml",
168264
GetType().Assembly);
169265

170-
SchemaMetadataUpdater.QuoteTableAndColumns(configuration);
266+
var dialect = Dialect.Dialect.GetDialect(configuration.GetDerivedProperties());
267+
dialect.Keywords.Add("Abracadabra");
268+
269+
SchemaMetadataUpdater.Update(configuration, dialect);
270+
SchemaMetadataUpdater.QuoteTableAndColumns(configuration, dialect);
171271

172272
var cm = configuration.GetClassMapping(typeof(Order));
173273
Assert.That(cm.Table.IsQuoted);
174274
var culs = new List<Column>(cm.Table.ColumnIterator);
175275
Assert.That(GetColumnByName(culs, "From").IsQuoted);
176276
Assert.That(GetColumnByName(culs, "And").IsQuoted);
177277
Assert.That(GetColumnByName(culs, "Select").IsQuoted);
278+
Assert.That(GetColumnByName(culs, "Abracadabra").IsQuoted);
178279
Assert.That(!GetColumnByName(culs, "Name").IsQuoted);
179280
}
180281
}

0 commit comments

Comments
 (0)