RFC 21:OGR SQL类型转换和字段名别名

作者:Tamas Szekeres

联系方式:szekerest@gmail.com

状态:通过

总结

此建议支持更改OGR SQL select列表中的列名和列类型。

此更改的主要动机是在将OGR_样式的特殊字段从每个数据源传输到另一个数据源时提供更好的控制。例如,我们可以使用以下命令行为此目的使用ogr2ogr:

ogr2ogr -f "ESRI Shapefile" -sql "select *, OGR_STYLE from rivers" rivers.shp rivers.tab

默认情况下,形状驱动程序会将OGR_样式字段的长度截断为80个字符,这可能不足以保存实际值。为了解决这个问题,我们可能需要在选择列表中指定所需的长度,例如:

ogr2ogr -f "ESRI Shapefile" -sql "select *, CAST(OGR_STYLE AS character(255)) from rivers" rivers.shp rivers.tab

在某些情况下,更改目标数据源中字段的名称也很有用:

ogr2ogr -f "ESRI Shapefile" -sql "select *, CAST(OGR_STYLE AS character(255)) AS 'STYLE' from rivers" rivers.shp rivers.tab

主要概念

为了支持这些新特性,我们将扩展当前的OGR SQL语法。建议的添加将保持语法符合SQL92规范:

SELECT <field-list> FROM <table_def>
     [LEFT JOIN <table_def>
      ON [<table_ref>.]<key_field> = [<table_ref>.].<key_field>]*
     [WHERE <where-expr>]
     [ORDER BY <sort specification list>]

<field-list> ::= <column-spec> [ { , <column-spec> }... ]

<column-spec> ::= <field-spec> [ <as clause> ]
                 | CAST ( <field-spec> AS <data type> ) [ <as clause> ]

<field-spec> ::= [DISTINCT] <field_ref>
                 | <field_func> ( [DISTINCT] <field-ref> )
                 | Count(*)

<as clause> ::= [ AS ] <column_name>

<data type> ::= character [ ( field_length ) ]
                | float [ ( field_length ) ]
                | numeric [ ( field_length [, field_precision ] ) ]
                | integer [ ( field_length ) ]
                | date [ ( field_length ) ]
                | time [ ( field_length ) ]
                | timestamp [ ( field_length ) ]

<field-func> ::= AVG | MAX | MIN | SUM | COUNT

<field_ref>  ::= [<table_ref>.]field_name

<sort specification list> ::=
              <sort specification> [ { <comma> <sort specification> }... ]

<sort specification> ::= <sort key> [ <ordering specification> ]

<sort key> ::=  <field_ref>

<ordering specification> ::= ASC | DESC

<table_def> ::= ['<datasource name>'.]table_name [table_alias]

<table_ref> ::= table_name | table_alias

此RFC没有处理到“整数列表”、“双列表”和“字符串列表”OGR数据类型的实现转换,这些数据类型不符合SQL92规范,并且OGR代码中缺少必要的转换例程。

实施

要实现添加,应在OGR代码库中进行以下更改:

  1. 在ogr_swq.h中,我必须在swq_col_def中添加4个字段,以保持字段别名目标类型、字段长度和字段精度

  2. 在ogr_swq.h swq_DATE、swq_TIME中,swq_TIMESTAMP将添加到swq_field_type enum。

  3. 在swq.c中,我必须更改swq_select_preparse以处理字段别名和转换规范。

  4. 将添加一个新函数(swq_parse_typename)来分析支持的类型名。

  5. 在ogr_gensql.cpp中,OGRGenSQLResultsLayer的.ctor将被更改,以设置到目标数据源的字段名和字段长度

  6. 在ogr_gensql.cpp中,TranslateFeature将被修改以处理类型更改(如果指定)。

向后兼容性

将保留当前SQL语法的向后兼容性。此添加不需要更改OGR C和SWIG API。

文档

将更新OGR SQL文档以反映新功能。我将负责更新OGR样式文档,支持在数据源之间传输样式。

实施人员配置

Tamas Szekeres将在开发版本中实现RFC。

Frank wartemdam将根据这个新功能实现回归测试脚本。

工具书类

  • 跟踪此功能的错误(包含所有建议的代码更改):#2171

投票历史

弗兰克·温特丹+1

丹尼尔·莫里塞特+1

霍华德·巴特勒+1

甚至鲁奥+1

塔马斯泽凯雷斯+1

安德烈·基塞列夫+0