Skip to content

Commit 7997e22

Browse files
lillo42bahusoid
authored andcommitted
Fix quoting <key /> columns containing reserved words
Fixes: #1100 Co-authored-by: Roman Artiukhin <bahusdrive@gmail.com>
1 parent b734d00 commit 7997e22

File tree

7 files changed

+194
-1
lines changed

7 files changed

+194
-1
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System;
12+
using System.Linq;
13+
using NHibernate.Cfg;
14+
using NUnit.Framework;
15+
using NHibernate.Linq;
16+
17+
namespace NHibernate.Test.NHSpecificTest.NH2892
18+
{
19+
using System.Threading.Tasks;
20+
[TestFixture]
21+
public class FixtureAsync : BugTestCase
22+
{
23+
protected override void Configure(Configuration configuration)
24+
{
25+
configuration.SetProperty("hbm2ddl.keywords", "auto-quote");
26+
}
27+
28+
protected override void OnSetUp()
29+
{
30+
using (ISession session = OpenSession())
31+
{
32+
var order = new Order();
33+
34+
session.Save(order);
35+
session.Flush();
36+
37+
var orderLine = new OrderLine
38+
{
39+
Orders = order
40+
};
41+
42+
session.Save(orderLine);
43+
session.Flush();
44+
}
45+
}
46+
47+
protected override void OnTearDown()
48+
{
49+
using (ISession session = OpenSession())
50+
{
51+
session.Delete($"from {nameof(OrderLine)}");
52+
session.Delete($"from {nameof(Order)}");
53+
session.Flush();
54+
}
55+
}
56+
57+
[Test]
58+
public async Task SelectOrderLineFromOrderAsync()
59+
{
60+
using (ISession session = OpenSession())
61+
{
62+
var order = await (session.Query<Order>().FirstOrDefaultAsync());
63+
64+
Assert.That(order, Is.Not.Null);
65+
Assert.DoesNotThrow(() => order.Elements.FirstOrDefault());
66+
Assert.That(order.OrderLines, Is.Not.Null);
67+
Assert.NotZero(order.OrderLines.Count);
68+
Assert.NotZero(order.OrderLines.First().Id);
69+
}
70+
}
71+
}
72+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Linq;
3+
using NHibernate.Cfg;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.NHSpecificTest.NH2892
7+
{
8+
[TestFixture]
9+
public class Fixture : BugTestCase
10+
{
11+
protected override void Configure(Configuration configuration)
12+
{
13+
configuration.SetProperty("hbm2ddl.keywords", "auto-quote");
14+
}
15+
16+
protected override void OnSetUp()
17+
{
18+
using (ISession session = OpenSession())
19+
{
20+
var order = new Order();
21+
22+
session.Save(order);
23+
session.Flush();
24+
25+
var orderLine = new OrderLine
26+
{
27+
Orders = order
28+
};
29+
30+
session.Save(orderLine);
31+
session.Flush();
32+
}
33+
}
34+
35+
protected override void OnTearDown()
36+
{
37+
using (ISession session = OpenSession())
38+
{
39+
session.Delete($"from {nameof(OrderLine)}");
40+
session.Delete($"from {nameof(Order)}");
41+
session.Flush();
42+
}
43+
}
44+
45+
[Test]
46+
public void SelectOrderLineFromOrder()
47+
{
48+
using (ISession session = OpenSession())
49+
{
50+
var order = session.Query<Order>().FirstOrDefault();
51+
52+
Assert.That(order, Is.Not.Null);
53+
Assert.DoesNotThrow(() => order.Elements.FirstOrDefault());
54+
Assert.That(order.OrderLines, Is.Not.Null);
55+
Assert.NotZero(order.OrderLines.Count);
56+
Assert.NotZero(order.OrderLines.First().Id);
57+
}
58+
}
59+
}
60+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test"
3+
namespace="NHibernate.Test.NHSpecificTest.NH2892">
4+
<class name="Order" table="Order" lazy="false">
5+
<id name="Id" column="id">
6+
<generator class="native"/>
7+
</id>
8+
<set name="OrderLines" table="OrderOrderLine" inverse="true" cascade="all-delete-orphan">
9+
<key column="Order"/>
10+
<one-to-many class="OrderLine"/>
11+
</set>
12+
<bag name="Elements" cascade="none">
13+
<key column="id"/>
14+
<element column="Order" type="int"/>
15+
</bag>
16+
</class>
17+
<class name="OrderLine" table="OrderOrderLine" lazy="false">
18+
<id name="Id" column="id">
19+
<generator class="native"/>
20+
</id>
21+
<many-to-one name="Orders" column="Order" not-null="true"/>
22+
</class>
23+
</hibernate-mapping>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH2892
4+
{
5+
public class Order
6+
{
7+
public virtual int Id { get; set; }
8+
public virtual ISet<OrderLine> OrderLines { get; set; } = new HashSet<OrderLine>();
9+
public virtual IList<int> Elements { get; set; } = new List<int>();
10+
}
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH2892
4+
{
5+
public class OrderLine
6+
{
7+
public virtual int Id { get; set; }
8+
public virtual Order Orders { get; set; }
9+
}
10+
}

src/NHibernate/Async/Tool/hbm2ddl/SchemaMetadataUpdater.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using NHibernate.Engine;
1414
using NHibernate.Mapping;
1515
using System.Collections.Generic;
16+
using System.Linq;
1617

1718
namespace NHibernate.Tool.hbm2ddl
1819
{

src/NHibernate/Tool/hbm2ddl/SchemaMetadataUpdater.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using NHibernate.Engine;
44
using NHibernate.Mapping;
55
using System.Collections.Generic;
6+
using System.Linq;
67

78
namespace NHibernate.Tool.hbm2ddl
89
{
@@ -61,6 +62,8 @@ public static void QuoteTableAndColumns(Configuration configuration, Dialect.Dia
6162
foreach (var cm in configuration.CollectionMappings)
6263
{
6364
QuoteTable(cm.Table, dialect);
65+
QuoteColumns(cm.Key, dialect);
66+
QuoteColumns(cm.Element, dialect);
6467
}
6568
}
6669

@@ -70,7 +73,20 @@ private static void QuoteTable(Table table, Dialect.Dialect dialect)
7073
{
7174
table.IsQuoted = true;
7275
}
73-
foreach (var column in table.ColumnIterator)
76+
77+
QuoteColumns(table.ColumnIterator, dialect);
78+
}
79+
80+
private static void QuoteColumns(IValue value, Dialect.Dialect dialect)
81+
{
82+
if (value == null)
83+
return;
84+
QuoteColumns(value.ColumnIterator.OfType<Column>(), dialect);
85+
}
86+
87+
private static void QuoteColumns(IEnumerable<Column> columns, Dialect.Dialect dialect)
88+
{
89+
foreach (var column in columns)
7490
{
7591
if (!column.IsQuoted && dialect.IsKeyword(column.Name))
7692
{

0 commit comments

Comments
 (0)