# [Know Issue] 查询视图报错ERROR 1105 (HY000): Can't find column Column#xx

## Key Words

视图，1105，Can't find column Column

## Description

查询视图时报错 ERROR 1105 (HY000): Can't find column Column#xx IN schema Column

## Root Cause

该问题属于谓词不正确的下推。
基本上大部分情况下谓词条件都能推过 Projection 的，除了以下一些情况：

1. 谓词中出现的列不在 Projection 的 schema 中。  
   这种情况比较少见，一般发生在子查询中，Apply 允许会将子查询外部出现的 schema 在子查询内部使用。但是在谓词下推的这个优化过程中，是没办法得到其 schema 的相关信息，所以在这种情况下下推后会报 Description 中的错。  
   例如：

   ```sql
   SELECT * FROM t1 WHERE t1.a IN (SELECT xxx FROM t2 WHERE t1.b > 6);
   ```

   如果 t2 带有 Projection，子查询部分的 t1.b > 6 是没办法继续下推下去的。因为 t1.b 的 schema 是在子查询外部，t2 部分没有相关的 schema 的信息。  
   注：t2 可以是子查询/ view/ CTE 等更复杂查询。

2. new collation 导致无法下推。  
   因为 new collation 的原因，在谓词下推通过 Projection 的时候一些情况不能等价替换，导致无法下推。  
   例如：

   ```sql
   DROP TABLE IF EXISTS t3;
   CREATE TABLE t3(c0 INT, primary key(c0));
   EXPLAIN SELECT v2.c0 FROM (SELECT 1 AS c0 FROM t3) v2 WHERE (v2.c0)like(True);
   EXPLAIN SELECT v2.c0 FROM (SELECT 1 AS c0 FROM t3) v2 WHERE v2.c0 > rand() * 2;
   ```

3. 谓词表达式中使用了 mutable 函数生成的列。  
   SELECT filed 中出现一些 mutable 函数，同时被下推的谓词表达式中使用了这些 mutable 函数生成的列。  
   mutable 函数：可以简单的理解为每次执行的结果都不一样的函数，比如 rand/ sleep/ unix_time 等函数。  
   例如：

   ```sql
   EXPLAIN SELECT v2.c0 FROM ( SELECT rand() AS c0 fromt3) v2 WHERE v2.co > 0.5;
   ```

   在这个查询中，selection 是不应该被下推的。

## Diagnostic Steps

1. 报错内容为 ERROR 1105 (HY000): Can't find column Column#xx IN schema Column
2. 根据 Root Cause 描述，定位是属于哪一种情况导致的谓词错误下推。

## Resolution

v6.4.0 及以上版本，Fix PR [#38802](https://github.com/pingcap/tidb/pull/38802)。

## Workaround

根据不同的 Root Cause 调整 SQL 文本或者 collation 定义。

## Affected Versions

v6.0.0 ~ v6.3.x
