summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-03-27 13:09:09 +0400
committerunknown <bar@bar.mysql.r18.ru>2003-03-27 13:09:09 +0400
commit8bbbd1d6f84740e1def5d34251f1942c19805543 (patch)
treecf02a1f110ca4ad00d79000f82123c306165adf0 /sql
parent27e77a8fd6f5531e64557c20d594b85050df96b6 (diff)
downloadmariadb-git-8bbbd1d6f84740e1def5d34251f1942c19805543.tar.gz
More OpenGIS compatibility:
Point, MultiLine, Poligom, etc, are now not aliases for Geometry, but separate field types.
Diffstat (limited to 'sql')
-rw-r--r--sql/field.cc31
-rw-r--r--sql/field.h22
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_yacc.yy14
-rw-r--r--sql/table.cc16
-rw-r--r--sql/unireg.cc6
8 files changed, 83 insertions, 14 deletions
diff --git a/sql/field.cc b/sql/field.cc
index 6b403b85aae..7d877a02bf7 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4775,7 +4775,33 @@ void Field_geom::set_key_image(char *buff, uint length, CHARSET_INFO *cs)
void Field_geom::sql_type(String &res) const
{
- res.set("geometry", 8, &my_charset_latin1);
+ CHARSET_INFO *cs= &my_charset_latin1;
+ switch (geom_type)
+ {
+ case GEOM_POINT:
+ res.set("point", 5, cs);
+ break;
+ case GEOM_LINESTRING:
+ res.set("linestring", 10, cs);
+ break;
+ case GEOM_POLYGON:
+ res.set("polygon", 7, cs);
+ break;
+ case GEOM_MULTIPOINT:
+ res.set("multipoint", 10, cs);
+ break;
+ case GEOM_MULTILINESTRING:
+ res.set("multilinestring", 15, cs);
+ break;
+ case GEOM_MULTIPOLYGON:
+ res.set("multipolygon", 12, cs);
+ break;
+ case GEOM_GEOMETRYCOLLECTION:
+ res.set("geometrycollection", 18, cs);
+ break;
+ default:
+ res.set("geometry", 8, cs);
+ }
}
@@ -5286,6 +5312,7 @@ Field *make_field(char *ptr, uint32 field_length,
uint pack_flag,
enum_field_types field_type,
CHARSET_INFO *field_charset,
+ Field::geometry_type geom_type,
Field::utype unireg_check,
TYPELIB *interval,
const char *field_name,
@@ -5309,7 +5336,7 @@ Field *make_field(char *ptr, uint32 field_length,
if (f_is_geom(pack_flag))
return new Field_geom(ptr,null_pos,null_bit,
unireg_check, field_name, table,
- pack_length);
+ pack_length, geom_type);
if (f_is_blob(pack_flag))
return new Field_blob(ptr,null_pos,null_bit,
unireg_check, field_name, table,
diff --git a/sql/field.h b/sql/field.h
index aad13508323..1b7906f9fb5 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -50,7 +50,12 @@ public:
enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
BIT_FIELD, TIMESTAMP_FIELD,CAPITALIZE,BLOB_FIELD};
-
+ enum geometry_type
+ {
+ GEOM_GEOMETRY = 0, GEOM_POINT = 1, GEOM_LINESTRING = 2, GEOM_POLYGON = 3,
+ GEOM_MULTIPOINT = 4, GEOM_MULTILINESTRING = 5, GEOM_MULTIPOLYGON = 6,
+ GEOM_GEOMETRYCOLLECTION = 7
+ };
enum imagetype { itRAW, itMBR};
utype unireg_check;
@@ -931,15 +936,20 @@ public:
class Field_geom :public Field_blob {
public:
+ enum geometry_type geom_type;
+
Field_geom(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
- struct st_table *table_arg,uint blob_pack_length)
+ struct st_table *table_arg,uint blob_pack_length,
+ enum geometry_type geom_type_arg)
:Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
- field_name_arg, table_arg, blob_pack_length,&my_charset_bin) {}
+ field_name_arg, table_arg, blob_pack_length,&my_charset_bin)
+ { geom_type= geom_type_arg; }
Field_geom(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
- struct st_table *table_arg)
+ struct st_table *table_arg, enum geometry_type geom_type_arg)
:Field_blob(len_arg, maybe_null_arg, field_name_arg,
- table_arg, &my_charset_bin) {}
+ table_arg, &my_charset_bin)
+ { geom_type= geom_type_arg; }
enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; }
enum_field_types type() const { return FIELD_TYPE_GEOMETRY; }
void sql_type(String &str) const;
@@ -1033,6 +1043,7 @@ public:
Field::utype unireg_check;
TYPELIB *interval; // Which interval to use
CHARSET_INFO *charset;
+ Field::geometry_type geom_type;
Field *field; // For alter table
uint8 row,col,sc_length,interval_id; // For rea_create_table
@@ -1086,6 +1097,7 @@ Field *make_field(char *ptr, uint32 field_length,
uchar *null_pos, uchar null_bit,
uint pack_flag, enum_field_types field_type,
CHARSET_INFO *cs,
+ Field::geometry_type geom_type,
Field::utype unireg_check,
TYPELIB *interval, const char *field_name,
struct st_table *table);
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 4ad1335d080..678af8f881d 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -565,7 +565,8 @@ bool add_field_to_list(THD *thd, char *field_name, enum enum_field_types type,
char *length, char *decimal,
uint type_modifier,
Item *default_value, Item *comment,
- char *change, TYPELIB *interval,CHARSET_INFO *cs);
+ char *change, TYPELIB *interval,CHARSET_INFO *cs,
+ uint uint_geom_type);
void store_position_for_column(const char *name);
bool add_to_list(THD *thd, SQL_LIST &list,Item *group,bool asc=0);
void add_join_on(TABLE_LIST *b,Item *expr);
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 0d284d5f619..6abcd5e8fea 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -449,6 +449,7 @@ typedef struct st_lex
create_field *last_field;
Item *default_value, *comment;
CHARSET_INFO *thd_charset;
+ uint uint_geom_type;
LEX_USER *grant_user;
gptr yacc_yyss,yacc_yyvs;
THD *thd;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index d08e6b70634..3169d2235f5 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3391,7 +3391,8 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
char *length, char *decimals,
uint type_modifier,
Item *default_value, Item *comment,
- char *change, TYPELIB *interval, CHARSET_INFO *cs)
+ char *change, TYPELIB *interval, CHARSET_INFO *cs,
+ uint uint_geom_type)
{
register create_field *new_field;
LEX *lex= &thd->lex;
@@ -3445,6 +3446,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
new_field->interval=0;
new_field->pack_length=0;
new_field->charset=cs;
+ new_field->geom_type= (Field::geometry_type) uint_geom_type;
if (!comment)
{
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 84c68d37c91..1d9a3f2df10 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1114,7 +1114,8 @@ field_spec:
(enum enum_field_types) $3,
lex->length,lex->dec,lex->type,
lex->default_value, lex->comment,
- lex->change,lex->interval,lex->charset))
+ lex->change,lex->interval,lex->charset,
+ lex->uint_geom_type))
YYABORT;
};
@@ -1167,20 +1168,28 @@ type:
| BLOB_SYM opt_len { Lex->charset=&my_charset_bin;
$$=FIELD_TYPE_BLOB; }
| GEOMETRY_SYM { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_GEOMETRY;
$$=FIELD_TYPE_GEOMETRY; }
| GEOMETRYCOLLECTION { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_GEOMETRYCOLLECTION;
$$=FIELD_TYPE_GEOMETRY; }
| POINT_SYM { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_POINT;
$$=FIELD_TYPE_GEOMETRY; }
| MULTIPOINT { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_MULTIPOINT;
$$=FIELD_TYPE_GEOMETRY; }
| LINESTRING { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_LINESTRING;
$$=FIELD_TYPE_GEOMETRY; }
| MULTILINESTRING { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_MULTILINESTRING;
$$=FIELD_TYPE_GEOMETRY; }
| POLYGON { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_POLYGON;
$$=FIELD_TYPE_GEOMETRY; }
| MULTIPOLYGON { Lex->charset=&my_charset_bin;
+ Lex->uint_geom_type= Field::GEOM_MULTIPOLYGON;
$$=FIELD_TYPE_GEOMETRY; }
| MEDIUMBLOB { Lex->charset=&my_charset_bin;
$$=FIELD_TYPE_MEDIUM_BLOB; }
@@ -1549,7 +1558,8 @@ alter_list_item:
(enum enum_field_types) $5,
lex->length,lex->dec,lex->type,
lex->default_value, lex->comment,
- $3.str, lex->interval, lex->charset))
+ $3.str, lex->interval, lex->charset,
+ lex->uint_geom_type))
YYABORT;
}
opt_place
diff --git a/sql/table.cc b/sql/table.cc
index 17bb15d3033..9bea4a09b05 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -371,6 +371,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
uint pack_flag, interval_nr, unireg_type, recpos, field_length;
enum_field_types field_type;
CHARSET_INFO *charset=NULL;
+ Field::geometry_type geom_type= Field::GEOM_GEOMETRY;
LEX_STRING comment;
if (new_frm_ver == 3)
@@ -384,9 +385,19 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
uint comment_length=uint2korr(strpos+15);
field_type=(enum_field_types) (uint) strpos[13];
- if (!(charset=get_charset((uint) strpos[14], MYF(0))))
- charset= (outparam->table_charset ? outparam->table_charset:
+
+ // charset and geometry_type share the same byte in frm
+ if (field_type == FIELD_TYPE_GEOMETRY)
+ {
+ geom_type= (Field::geometry_type) strpos[14];
+ charset= &my_charset_bin;
+ }
+ else
+ {
+ if (!(charset=get_charset((uint) strpos[14], MYF(0))))
+ charset= (outparam->table_charset ? outparam->table_charset:
default_charset_info);
+ }
if (!comment_length)
{
comment.str= (char*) "";
@@ -420,6 +431,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
pack_flag,
field_type,
charset,
+ geom_type,
(Field::utype) MTYP_TYPENR(unireg_type),
(interval_nr ?
outparam->intervals+interval_nr-1 :
diff --git a/sql/unireg.cc b/sql/unireg.cc
index fa843fe5d1e..5e723281d3f 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -458,7 +458,10 @@ static bool pack_fields(File file,List<create_field> &create_fields)
int2store(buff+10,field->unireg_check);
buff[12]= (uchar) field->interval_id;
buff[13]= (uchar) field->sql_type;
- buff[14]= (uchar) field->charset->number;
+ if (field->sql_type == FIELD_TYPE_GEOMETRY)
+ buff[14]= (uchar) field->geom_type;
+ else
+ buff[14]= (uchar) field->charset->number;
int2store(buff+15, field->comment.length);
comment_length+= field->comment.length;
set_if_bigger(int_count,field->interval_id);
@@ -573,6 +576,7 @@ static bool make_empty_rec(File file,enum db_type table_type,
field->pack_flag,
field->sql_type,
field->charset,
+ field->geom_type,
field->unireg_check,
field->interval,
field->field_name,