Commit c3db4459 authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-12 OpenGIS: create required tables: GeometryColumns, related views.

GEOMETRY_COLUMNS and SPATIAL_REF_SYS tables added to the INFORMATION_SCHEMA.
parent c1f5f61c
...@@ -1613,3 +1613,37 @@ insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))')); ...@@ -1613,3 +1613,37 @@ insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))'));
ERROR 22007: Incorrect POINT value: 'POLYGON' for column 'pt' at row 1 ERROR 22007: Incorrect POINT value: 'POLYGON' for column 'pt' at row 1
drop table t1; drop table t1;
End of 5.5 tests End of 5.5 tests
SHOW CREATE TABLE information_schema.geometry_columns;
Table Create Table
GEOMETRY_COLUMNS CREATE TEMPORARY TABLE `GEOMETRY_COLUMNS` (
`F_TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
`F_TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
`F_TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
`F_GEOMETRY_COLUMN` varchar(64) NOT NULL DEFAULT '',
`G_TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
`G_TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
`G_TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
`G_GEOMETRY_COLUMN` varchar(64) NOT NULL DEFAULT '',
`STORAGE_TYPE` tinyint(2) NOT NULL DEFAULT '0',
`GEOMETRY_TYPE` int(7) NOT NULL DEFAULT '0',
`COORD_DIMENSION` tinyint(2) NOT NULL DEFAULT '0',
`MAX_PPR` tinyint(2) NOT NULL DEFAULT '0',
`SRID` smallint(5) NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE information_schema.spatial_ref_sys;
Table Create Table
SPATIAL_REF_SYS CREATE TEMPORARY TABLE `SPATIAL_REF_SYS` (
`SRID` smallint(5) NOT NULL DEFAULT '0',
`AUTH_NAME` varchar(512) NOT NULL DEFAULT '',
`AUTH_SRID` smallint(5) NOT NULL DEFAULT '0',
`SRTEXT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
create table t1(g GEOMETRY, pt POINT);
create table t2(g LINESTRING, pl POLYGON);
select * from information_schema.geometry_columns;
F_TABLE_CATALOG F_TABLE_SCHEMA F_TABLE_NAME F_GEOMETRY_COLUMN G_TABLE_CATALOG G_TABLE_SCHEMA G_TABLE_NAME G_GEOMETRY_COLUMN STORAGE_TYPE GEOMETRY_TYPE COORD_DIMENSION MAX_PPR SRID
def test t1 def test t1 g 1 0 2 0 0 0
def test t1 def test t1 pt 1 1 2 0 0 0
def test t2 def test t2 g 1 2 2 0 0 0
def test t2 def test t2 pl 1 3 2 0 0 0
drop table t1, t2;
...@@ -58,6 +58,7 @@ ENABLED_ROLES ...@@ -58,6 +58,7 @@ ENABLED_ROLES
ENGINES ENGINES
EVENTS EVENTS
FILES FILES
GEOMETRY_COLUMNS
GLOBAL_STATUS GLOBAL_STATUS
GLOBAL_VARIABLES GLOBAL_VARIABLES
INDEX_STATISTICS INDEX_STATISTICS
...@@ -74,6 +75,7 @@ SCHEMATA ...@@ -74,6 +75,7 @@ SCHEMATA
SCHEMA_PRIVILEGES SCHEMA_PRIVILEGES
SESSION_STATUS SESSION_STATUS
SESSION_VARIABLES SESSION_VARIABLES
SPATIAL_REF_SYS
STATISTICS STATISTICS
SYSTEM_VARIABLES SYSTEM_VARIABLES
TABLES TABLES
......
...@@ -1473,3 +1473,12 @@ insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))')); ...@@ -1473,3 +1473,12 @@ insert into t1 values(Geomfromtext('POLYGON((1 1, 2 2, 2 1, 1 1))'));
drop table t1; drop table t1;
--echo End of 5.5 tests --echo End of 5.5 tests
SHOW CREATE TABLE information_schema.geometry_columns;
SHOW CREATE TABLE information_schema.spatial_ref_sys;
create table t1(g GEOMETRY, pt POINT);
create table t2(g LINESTRING, pl POLYGON);
select * from information_schema.geometry_columns;
drop table t1, t2;
...@@ -2571,6 +2571,7 @@ class Field_geom :public Field_blob { ...@@ -2571,6 +2571,7 @@ class Field_geom :public Field_blob {
int reset(void) { return Field_blob::reset() || !maybe_null(); } int reset(void) { return Field_blob::reset() || !maybe_null(); }
geometry_type get_geometry_type() { return geom_type; }; geometry_type get_geometry_type() { return geom_type; };
uint get_srid() { return 0; }
}; };
#endif /*HAVE_SPATIAL*/ #endif /*HAVE_SPATIAL*/
......
...@@ -750,7 +750,11 @@ enum enum_schema_tables ...@@ -750,7 +750,11 @@ enum enum_schema_tables
SCH_TABLE_PRIVILEGES, SCH_TABLE_PRIVILEGES,
SCH_TRIGGERS, SCH_TRIGGERS,
SCH_USER_PRIVILEGES, SCH_USER_PRIVILEGES,
SCH_VIEWS SCH_VIEWS,
#ifdef HAVE_SPATIAL
SCH_GEOMETRY_COLUMNS,
SCH_SPATIAL_REF_SYS,
#endif /*HAVE_SPATIAL*/
}; };
struct TABLE_SHARE; struct TABLE_SHARE;
......
...@@ -331,6 +331,99 @@ int fill_all_plugins(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -331,6 +331,99 @@ int fill_all_plugins(THD *thd, TABLE_LIST *tables, COND *cond)
} }
#ifdef HAVE_SPATIAL
static int fill_spatial_ref_sys(THD *thd, TABLE_LIST *tables, COND *cond)
{
DBUG_ENTER("fill_spatial_ref_sys");
TABLE *table= tables->table;
CHARSET_INFO *cs= system_charset_info;
int result= 1;
restore_record(table, s->default_values);
table->field[0]->store(-1, FALSE); /*SRID*/
table->field[1]->store(STRING_WITH_LEN("Not defined"), cs); /*AUTH_NAME*/
table->field[2]->store(-1, FALSE); /*AUTH_SRID*/
table->field[3]->store(STRING_WITH_LEN(""), cs);/*SRTEXT*/
if (schema_table_store_record(thd, table))
goto exit;
table->field[0]->store(0, TRUE); /*SRID*/
table->field[1]->store(STRING_WITH_LEN("Cartesian plane"), cs); /*AUTH_NAME*/
table->field[2]->store(0, TRUE); /*AUTH_SRID*/
table->field[3]->store(STRING_WITH_LEN(""), cs);/*SRTEXT*/
if (schema_table_store_record(thd, table))
goto exit;
result= 0;
exit:
DBUG_RETURN(result);
}
static int get_geometry_column_record(THD *thd, TABLE_LIST *tables,
TABLE *table, bool res,
LEX_STRING *db_name,
LEX_STRING *table_name)
{
CHARSET_INFO *cs= system_charset_info;
TABLE *show_table;
Field **ptr, *field;
DBUG_ENTER("get_geometry_column_record");
if (tables->schema_table)
goto exit;
show_table= tables->table;
ptr= show_table->field;
show_table->use_all_columns(); // Required for default
restore_record(show_table, s->default_values);
for (; (field= *ptr) ; ptr++)
if (field->type() == MYSQL_TYPE_GEOMETRY)
{
Field_geom *fg= (Field_geom *) field;
DEBUG_SYNC(thd, "get_schema_column");
/* Get default row, with all NULL fields set to NULL */
restore_record(table, s->default_values);
/*F_TABLE_CATALOG*/
table->field[0]->store(STRING_WITH_LEN("def"), cs);
/*F_TABLE_SCHEMA*/
table->field[1]->store(db_name->str, db_name->length, cs);
/*F_TABLE_NAME*/
table->field[2]->store(table_name->str, table_name->length, cs);
/*G_TABLE_CATALOG*/
table->field[3]->store(STRING_WITH_LEN("def"), cs);
/*G_TABLE_SCHEMA*/
table->field[4]->store(db_name->str, db_name->length, cs);
/*G_TABLE_NAME*/
table->field[5]->store(table_name->str, table_name->length, cs);
/*G_GEOMETRY_COLUMN*/
table->field[6]->store(field->field_name, strlen(field->field_name), cs);
/*STORAGE_TYPE*/
table->field[7]->store(1LL, TRUE); /*Always 1 (binary implementation)*/
/*GEOMETRY_TYPE*/
table->field[8]->store((longlong) (fg->get_geometry_type()), TRUE);
/*COORD_DIMENSION*/
table->field[9]->store(2LL, TRUE);
/*MAX_PPR*/
table->field[10]->set_null();
/*SRID*/
table->field[11]->store((longlong) (fg->get_srid()), TRUE);
if (schema_table_store_record(thd, table))
DBUG_RETURN(1);
}
exit:
DBUG_RETURN(0);
}
#endif /*HAVE_SPATIAL*/
/*************************************************************************** /***************************************************************************
** List all Authors. ** List all Authors.
** If you can update it, you get to be in it :) ** If you can update it, you get to be in it :)
...@@ -8747,6 +8840,39 @@ ST_FIELD_INFO show_explain_fields_info[]= ...@@ -8747,6 +8840,39 @@ ST_FIELD_INFO show_explain_fields_info[]=
}; };
#ifdef HAVE_SPATIAL
ST_FIELD_INFO geometry_columns_fields_info[]=
{
{"F_TABLE_CATALOG", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"F_TABLE_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"F_TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"F_GEOMETRY_COLUMN", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Field",
OPEN_FRM_ONLY},
{"G_TABLE_CATALOG", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"G_TABLE_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"G_TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FRM_ONLY},
{"G_GEOMETRY_COLUMN", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Field",
OPEN_FRM_ONLY},
{"STORAGE_TYPE", 2, MYSQL_TYPE_TINY, 0, 0, 0, OPEN_FRM_ONLY},
{"GEOMETRY_TYPE", 7, MYSQL_TYPE_LONG, 0, 0, 0, OPEN_FRM_ONLY},
{"COORD_DIMENSION", 2, MYSQL_TYPE_TINY, 0, 0, 0, OPEN_FRM_ONLY},
{"MAX_PPR", 2, MYSQL_TYPE_TINY, 0, 0, 0, OPEN_FRM_ONLY},
{"SRID", 5, MYSQL_TYPE_SHORT, 0, 0, 0, OPEN_FRM_ONLY},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0}
};
ST_FIELD_INFO spatial_ref_sys_fields_info[]=
{
{"SRID", 5, MYSQL_TYPE_SHORT, 0, 0, 0, SKIP_OPEN_TABLE},
{"AUTH_NAME", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE},
{"AUTH_SRID", 5, MYSQL_TYPE_SHORT, 0, 0, 0, SKIP_OPEN_TABLE},
{"SRTEXT", 2048, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0}
};
#endif /*HAVE_SPATIAL*/
/* /*
Description of ST_FIELD_INFO in table.h Description of ST_FIELD_INFO in table.h
...@@ -8847,6 +8973,13 @@ ST_SCHEMA_TABLE schema_tables[]= ...@@ -8847,6 +8973,13 @@ ST_SCHEMA_TABLE schema_tables[]=
{"VIEWS", view_fields_info, 0, {"VIEWS", view_fields_info, 0,
get_all_tables, 0, get_schema_views_record, 1, 2, 0, get_all_tables, 0, get_schema_views_record, 1, 2, 0,
OPEN_VIEW_ONLY|OPTIMIZE_I_S_TABLE}, OPEN_VIEW_ONLY|OPTIMIZE_I_S_TABLE},
#ifdef HAVE_SPATIAL
{"GEOMETRY_COLUMNS", geometry_columns_fields_info, 0,
get_all_tables, make_columns_old_format, get_geometry_column_record,
1, 2, 0, OPTIMIZE_I_S_TABLE|OPEN_VIEW_FULL},
{"SPATIAL_REF_SYS", spatial_ref_sys_fields_info, 0,
fill_spatial_ref_sys, make_old_format, 0, -1, -1, 0, 0},
#endif /*HAVE_SPATIAL*/
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment