1+ using System ;
12using System . Collections . Generic ;
23using System . Linq ;
3- using NHibernate . Cfg ;
4+ using NHibernate . Dialect ;
5+ using NHibernate . Driver ;
46using NHibernate . Engine ;
57using NHibernate . Mapping ;
68using NHibernate . Tool . hbm2ddl ;
79using NUnit . Framework ;
10+ using Environment = NHibernate . Cfg . Environment ;
811
912namespace 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