Changeset: 62473d254ce6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=62473d254ce6
Modified Files:
        sql/server/sql_parser.y
        sql/server/sql_scan.c
Branch: geo
Log Message:

parser changed to recognise 2d geometries with srid


diffs (121 lines):

diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -474,6 +474,7 @@ int yydebug=1;
        BOOL_FALSE BOOL_TRUE
        CURRENT_DATE CURRENT_TIMESTAMP CURRENT_TIME LOCALTIMESTAMP LOCALTIME
        LEX_ERROR 
+       GEOMETRY GEOMETRYSUBTYPE  
 
 %token USER CURRENT_USER SESSION_USER LOCAL LOCKED
 %token  CURRENT_ROLE sqlSESSION
@@ -4648,8 +4649,79 @@ data_type:
                                sql_init_subtype(&$$, t, $3, 0);
                          }
                        }
-
- ;
+| GEOMETRY {
+       sql_type *t = mvc_bind_type(m, "geometry");
+       if (!t) {
+               char *msg = sql_message("\b22000!type (%s) unknown", $1);
+
+               yyerror(m, msg);
+               _DELETE(msg);
+               $$.type = NULL;
+               YYABORT;
+         } else {
+               sql_init_subtype(&$$, t, 0, 0);
+         }
+}
+| GEOMETRY {
+               char* geoType = (char*) malloc(sizeof($1)); 
+               strcpy(geoType, $1); 
+               $<sval>$=geoType;
+       } '(' subgeometry_type ',' nonzero ')' {
+               char* geoType = $<sval>2; 
+               char* geoSubType = $<sval>4; 
+               int srid = $6; 
+
+               sql_type *t = mvc_bind_type(m, geoType);
+               if (!t) {
+                       char *msg = sql_message("\b22000!type (%s) unknown", 
$1);
+                       free(geoSubType);
+                       free(geoType);
+                       yyerror(m, msg);
+                       _DELETE(msg);
+                       $$.type = NULL;
+                       YYABORT;
+               } else {
+                       unsigned int geoSubType_i = 0;
+                       if(strcmp(geoSubType, "point") == 0 )
+                               geoSubType_i = 1;
+                       else if(strcmp(geoSubType, "linestring") == 0)
+                               geoSubType_i = 2;
+                       else if(strcmp(geoSubType, "polygon") == 0)
+                               geoSubType_i = 3;
+                       else if(strcmp(geoSubType, "multipoint") == 0)
+                               geoSubType_i = 4;
+                       else if(strcmp(geoSubType, "multilinestring") == 0)
+                               geoSubType_i = 5;
+                       else if(strcmp(geoSubType, "multipolygon") == 0)
+                               geoSubType_i = 6;
+                       else if(strcmp(geoSubType, "geometrycollection") == 0)
+                               geoSubType_i = 7;
+                       else {
+                               char *msg = sql_message("\b22000!type (%s) 
unknown", geoSubType);
+                               free(geoSubType);
+                               free(geoType);
+                               yyerror(m, msg);
+                               _DELETE(msg);
+                               $$.type = NULL;
+                               YYABORT;
+                       }       
+                       sql_init_subtype(&$$, t, geoSubType_i, srid);
+                       free(geoSubType);
+                       free(geoType);
+               }
+       }
+ ;
+
+subgeometry_type:
+  GEOMETRYSUBTYPE {
+               char* geoSubType = (char*) malloc(sizeof($1)); 
+               strcpy(geoSubType, $1); 
+               $<sval>$=geoSubType; }
+| string {
+               char* geoSubType = (char*) malloc(sizeof($1)); 
+               strcpy(geoSubType, $1); 
+               $<sval>$=geoSubType; }
+;
 
 type_alias:
  ALIAS
@@ -4764,6 +4836,7 @@ non_reserved_word:
 |  FILTER      { $$ = sa_strdup(SA, "filter"); }
 |  TEMPORARY   { $$ = sa_strdup(SA, "temporary"); }
 |  ANALYZE     { $$ = sa_strdup(SA, "analyze"); }
+|  GEOMETRY    { $$ = sa_strdup(SA, "geometry"); }
 ;
 
 name_commalist:
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -369,6 +369,16 @@ scanner_init_keywords(void)
        keywords_insert("URI", URI);
        keywords_insert("XMLAGG", XMLAGG);
 
+       /* keywords for opengis */
+       keywords_insert("GEOMETRY", GEOMETRY);
+       keywords_insert("POINT", GEOMETRYSUBTYPE);
+       keywords_insert("LINESTRING", GEOMETRYSUBTYPE);
+       keywords_insert("POLYGON", GEOMETRYSUBTYPE);
+       keywords_insert("MULTIPOINT", GEOMETRYSUBTYPE);
+       keywords_insert("MULTILINESTRING", GEOMETRYSUBTYPE);
+       keywords_insert("MULTIPOLYGON", GEOMETRYSUBTYPE);
+       keywords_insert("GEOMETRYCOLLECTION", GEOMETRYSUBTYPE);
+
 }
 
 #define find_keyword_bs(lc, s) find_keyword(lc->rs->buf+lc->rs->pos+s)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to