# Proposal
- Proposal: [Decouple logical from physical types](https://github.com/apache/datafusion/issues/11513)
- 逻辑类型是一种抽象表示,脱离它的物理实现。
- 物理实现:数据如何存储、访问和检索。
- **现状**:当前单纯依赖 arrow 的 DataType enum,类型和物理实现是一一对应的。
- **问题**:逻辑上相等的类型,在 Arrow 中有多种不同的 DataTypes
- string:Utf8,Dictionary(Utf8),RunEndEncoded 等
- **目标**:
- 吸纳 DataType 的一个子集作为 logical types
- 定义逻辑类型和物理类型在 planning 和 execution path 中的边界
- 引入 logical ScalarValue
- 定义如何为物理类型指定具体化选项
## 定义逻辑类型
- Arrow 有些类型包含了它们的编码信息(如 Large、Dictionary、FixedSize),这类类型应该丢弃编码信息,整合为一个逻辑类型。
- 允许将用户自定义的物理类型映射到已有的逻辑类型
- Arrow 类型扩展:[Extension types](https://arrow.apache.org/docs/format/Columnar.html#extension-types)
- 例如用户定义了一个物理类型的扩展
- 基于 List(UInt8)
- custom metadata:`{'ARROW:extension:name': 'myorg.mystring'}`
可以将其映射为逻辑类型 `Utf8`
- 用户自定义逻辑类型,包含:
- 一个描述它逻辑类型的结构
- 类型的 metadata
## 逻辑类型和物理类型的边界
### 在 plan 和 表达式中
- 逻辑类型只使用于逻辑计划和逻辑表达式(Expr)
- 逻辑计划不需要关心底层的编码
- 物理类型也只使用于 `ExecutionPlan` 和 `PhysicalExpr`
### 在函数中
- 函数签名使用逻辑类型,可以简化 coercion rules
- 更少的类型
- 更少的规则:例如定义规则为所有可以转换为 Utft8 的类型
- 函数调用执行处理物理类型。