diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala index 0f5239be6cae7..9670b7997c1a0 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/namedExpressions.scala @@ -25,7 +25,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen._ import org.apache.spark.sql.catalyst.plans.logical.EventTimeWatermark import org.apache.spark.sql.catalyst.trees.TreePattern import org.apache.spark.sql.catalyst.trees.TreePattern._ -import org.apache.spark.sql.catalyst.util.{quoteIfNeeded, METADATA_COL_ATTR_KEY} +import org.apache.spark.sql.catalyst.util._ import org.apache.spark.sql.types._ import org.apache.spark.util.collection.BitSet import org.apache.spark.util.collection.ImmutableBitSet @@ -190,7 +190,10 @@ case class Alias(child: Expression, name: String)( override def toAttribute: Attribute = { if (resolved) { - AttributeReference(name, child.dataType, child.nullable, metadata)(exprId, qualifier) + val a = AttributeReference(name, child.dataType, child.nullable, metadata)(exprId, qualifier) + // Alias has its own qualifier. It doesn't make sense to still restrict the hidden columns + // of natural/using join to be accessed by qualified name only. + if (a.qualifiedAccessOnly) a.markAsAllowAnyAccess() else a } else { UnresolvedAttribute.quoted(name) } diff --git a/sql/core/src/test/resources/sql-tests/inputs/natural-join.sql b/sql/core/src/test/resources/sql-tests/inputs/natural-join.sql index 9c9ce6c37babd..5815eee2d9e4e 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/natural-join.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/natural-join.sql @@ -52,6 +52,8 @@ SELECT nt1.k, nt2.k FROM nt1 natural join nt2; SELECT k FROM (SELECT nt2.k FROM nt1 natural join nt2); +SELECT nt2.k AS key FROM nt1 natural join nt2 ORDER BY key; + SELECT nt1.k, nt2.k FROM nt1 natural join nt2 where k = "one"; SELECT * FROM (SELECT * FROM nt1 natural join nt2); diff --git a/sql/core/src/test/resources/sql-tests/inputs/using-join.sql b/sql/core/src/test/resources/sql-tests/inputs/using-join.sql index 414221e5b71c3..0c06023b14db7 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/using-join.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/using-join.sql @@ -21,6 +21,8 @@ SELECT nt1.k, nt2.k FROM nt1 left outer join nt2 using (k); SELECT k FROM (SELECT nt2.k FROM nt1 left outer join nt2 using (k)); +SELECT nt2.k AS key FROM nt1 left outer join nt2 using (k) ORDER BY key; + SELECT nt1.k, nt2.k FROM nt1 left outer join nt2 using (k) ORDER BY nt2.k; SELECT k, nt1.k FROM nt1 left outer join nt2 using (k); @@ -47,6 +49,8 @@ SELECT nt1.k, nt2.k FROM nt1 right outer join nt2 using (k); SELECT k FROM (SELECT nt1.k FROM nt1 right outer join nt2 using (k)); +SELECT nt1.k AS key FROM nt1 right outer join nt2 using (k) ORDER BY key; + SELECT k, nt1.k FROM nt1 right outer join nt2 using (k); SELECT k, nt2.k FROM nt1 right outer join nt2 using (k); @@ -61,6 +65,8 @@ SELECT nt1.k, nt2.k FROM nt1 full outer join nt2 using (k); SELECT k FROM (SELECT nt2.k FROM nt1 full outer join nt2 using (k)); +SELECT nt2.k AS key FROM nt1 full outer join nt2 using (k) ORDER BY key; + SELECT k, nt1.k FROM nt1 full outer join nt2 using (k); SELECT k, nt2.k FROM nt1 full outer join nt2 using (k); @@ -75,6 +81,8 @@ SELECT nt1.k, nt2.k FROM nt1 inner join nt2 using (k); SELECT k FROM (SELECT nt2.k FROM nt1 inner join nt2 using (k)); +SELECT nt2.k AS key FROM nt1 inner join nt2 using (k) ORDER BY key; + SELECT k, nt1.k FROM nt1 inner join nt2 using (k); SELECT k, nt2.k FROM nt1 inner join nt2 using (k); diff --git a/sql/core/src/test/resources/sql-tests/results/natural-join.sql.out b/sql/core/src/test/resources/sql-tests/results/natural-join.sql.out index 9e5d12ed1fa6d..dc403af263587 100644 --- a/sql/core/src/test/resources/sql-tests/results/natural-join.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/natural-join.sql.out @@ -194,6 +194,16 @@ one two +-- !query +SELECT nt2.k AS key FROM nt1 natural join nt2 ORDER BY key +-- !query schema +struct +-- !query output +one +one +two + + -- !query SELECT nt1.k, nt2.k FROM nt1 natural join nt2 where k = "one" -- !query schema diff --git a/sql/core/src/test/resources/sql-tests/results/using-join.sql.out b/sql/core/src/test/resources/sql-tests/results/using-join.sql.out index e5780370ce61b..360507e727f48 100644 --- a/sql/core/src/test/resources/sql-tests/results/using-join.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/using-join.sql.out @@ -79,6 +79,17 @@ one two +-- !query +SELECT nt2.k AS key FROM nt1 left outer join nt2 using (k) ORDER BY key +-- !query schema +struct +-- !query output +NULL +one +one +two + + -- !query SELECT nt1.k, nt2.k FROM nt1 left outer join nt2 using (k) ORDER BY nt2.k -- !query schema @@ -212,6 +223,17 @@ one two +-- !query +SELECT nt1.k AS key FROM nt1 right outer join nt2 using (k) ORDER BY key +-- !query schema +struct +-- !query output +NULL +one +one +two + + -- !query SELECT k, nt1.k FROM nt1 right outer join nt2 using (k) -- !query schema @@ -294,6 +316,18 @@ one two +-- !query +SELECT nt2.k AS key FROM nt1 full outer join nt2 using (k) ORDER BY key +-- !query schema +struct +-- !query output +NULL +four +one +one +two + + -- !query SELECT k, nt1.k FROM nt1 full outer join nt2 using (k) -- !query schema @@ -370,6 +404,16 @@ one two +-- !query +SELECT nt2.k AS key FROM nt1 inner join nt2 using (k) ORDER BY key +-- !query schema +struct +-- !query output +one +one +two + + -- !query SELECT k, nt1.k FROM nt1 inner join nt2 using (k) -- !query schema