sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jso...@apache.org
Subject [sis] 02/03: SQL/MM : cleaning code
Date Wed, 27 Nov 2019 11:23:37 GMT
This is an automated email from the ASF dual-hosted git repository.

jsorel pushed a commit to branch feat/sqlmm
in repository https://gitbox.apache.org/repos/asf/sis.git

commit d7ae59674197ad44268e11092aef924baad46062
Author: jsorel <johann.sorel@geomatys.com>
AuthorDate: Wed Nov 27 11:20:44 2019 +0100

    SQL/MM : cleaning code
---
 .../apache/sis/internal/filter/sqlmm/SQLMM.java    | 244 ++++++++++-----------
 .../sis/internal/filter/sqlmm/ST_LineString.java   |   3 +-
 .../filter/sqlmm/todo/AbstractSpatialFunction.java |   7 +-
 .../todo/{Surface_ST_Area.java => ST_Area.java}    |  12 +-
 .../internal/filter/sqlmm/todo/ST_AsBinary.java    |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_AsGML.java   |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_AsText.java  |   8 +
 .../internal/filter/sqlmm/todo/ST_Boundary.java    |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Buffer.java  |   8 +
 .../{Surface_ST_Centroid.java => ST_Centroid.java} |  13 +-
 .../internal/filter/sqlmm/todo/ST_Contains.java    |   8 +
 .../internal/filter/sqlmm/todo/ST_ConvexHull.java  |   8 +
 .../internal/filter/sqlmm/todo/ST_CoordDim.java    |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Crosses.java |   8 +
 .../internal/filter/sqlmm/todo/ST_Difference.java  |   8 +
 .../internal/filter/sqlmm/todo/ST_Dimension.java   |   8 +
 .../internal/filter/sqlmm/todo/ST_Disjoint.java    |   8 +
 .../internal/filter/sqlmm/todo/ST_Distance.java    |   8 +
 .../{Curve_ST_EndPoint.java => ST_EndPoint.java}   |  12 +-
 .../internal/filter/sqlmm/todo/ST_Envelope.java    |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Equals.java  |   8 +
 ...ST_ExplicitPoint.java => ST_ExplicitPoint.java} |  12 +-
 ...n_ST_ExteriorRing.java => ST_ExteriorRing.java} |  12 +-
 .../filter/sqlmm/todo/ST_GeomCollection.java       |  14 +-
 ...eomColl_ST_GeometryN.java => ST_GeometryN.java} |  12 +-
 .../filter/sqlmm/todo/ST_GeometryType.java         |   8 +
 ...ST_InteriorRingN.java => ST_InteriorRingN.java} |  12 +-
 .../filter/sqlmm/todo/ST_Intersection.java         |   8 +
 .../internal/filter/sqlmm/todo/ST_Intersects.java  |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Is3D.java    |   8 +
 .../{Curve_ST_IsClosed.java => ST_IsClosed.java}   |  12 +-
 .../sis/internal/filter/sqlmm/todo/ST_IsEmpty.java |   8 +
 .../todo/{Curve_ST_IsRing.java => ST_IsRing.java}  |  12 +-
 .../internal/filter/sqlmm/todo/ST_IsSimple.java    |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_IsValid.java |   8 +
 .../todo/{Curve_ST_Length.java => ST_Length.java}  |  12 +-
 .../internal/filter/sqlmm/todo/ST_LineString.java  |   8 +
 .../filter/sqlmm/todo/ST_MultiLineString.java      |   8 +
 .../internal/filter/sqlmm/todo/ST_MultiPoint.java  |   8 +
 .../filter/sqlmm/todo/ST_MultiPolygon.java         |   8 +
 ...ST_NumGeometries.java => ST_NumGeometries.java} |  12 +-
 ...InteriorRings.java => ST_NumInteriorRings.java} |  12 +-
 .../{Line_ST_NumPoints.java => ST_NumPoints.java}  |  12 +-
 .../internal/filter/sqlmm/todo/ST_Overlaps.java    |   8 +
 ...Surface_ST_Perimeter.java => ST_Perimeter.java} |  12 +-
 .../sis/internal/filter/sqlmm/todo/ST_Point.java   |  11 +-
 .../todo/{Line_ST_PointN.java => ST_PointN.java}   |  12 +-
 ..._PointOnSurface.java => ST_PointOnSurface.java} |  13 +-
 .../sis/internal/filter/sqlmm/todo/ST_Polygon.java |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Relate.java  |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_SRID.java    |   8 +
 ...Curve_ST_StartPoint.java => ST_StartPoint.java} |  12 +-
 .../filter/sqlmm/todo/ST_SymDifference.java        |   8 +
 .../internal/filter/sqlmm/todo/ST_ToGeomColl.java  |   8 +
 .../filter/sqlmm/todo/ST_ToLineString.java         |   8 +
 .../internal/filter/sqlmm/todo/ST_ToMultiLine.java |   8 +
 .../filter/sqlmm/todo/ST_ToMultiPoint.java         |   8 +
 .../filter/sqlmm/todo/ST_ToMultiPolygon.java       |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_ToPoint.java |   8 +
 .../internal/filter/sqlmm/todo/ST_ToPolygon.java   |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Touches.java |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Union.java   |   8 +
 .../sis/internal/filter/sqlmm/todo/ST_Within.java  |   8 +
 .../sqlmm/todo/{Point_ST_X.java => ST_X.java}      |  12 +-
 .../internal/filter/sqlmm/todo/ST_XFromBinary.java |  39 ++--
 .../internal/filter/sqlmm/todo/ST_XFromGML.java    |  22 +-
 .../internal/filter/sqlmm/todo/ST_XFromText.java   |  39 ++--
 .../sqlmm/todo/{Point_ST_Y.java => ST_Y.java}      |  12 +-
 .../sqlmm/todo/{Point_ST_Z.java => ST_Z.java}      |  12 +-
 69 files changed, 729 insertions(+), 220 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
index ef9a6d3..bf11527 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/SQLMM.java
@@ -23,22 +23,22 @@ import org.opengis.filter.expression.Function;
 import org.opengis.util.FactoryException;
 import org.apache.sis.internal.feature.FunctionRegister;
 import org.apache.sis.internal.feature.Resources;
-import org.apache.sis.internal.filter.sqlmm.todo.CurvePolygon_ST_ExteriorRing;
-import org.apache.sis.internal.filter.sqlmm.todo.CurvePolygon_ST_InteriorRingN;
-import org.apache.sis.internal.filter.sqlmm.todo.CurvePolygon_ST_NumInteriorRings;
-import org.apache.sis.internal.filter.sqlmm.todo.Curve_ST_EndPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.Curve_ST_IsClosed;
-import org.apache.sis.internal.filter.sqlmm.todo.Curve_ST_IsRing;
-import org.apache.sis.internal.filter.sqlmm.todo.Curve_ST_Length;
-import org.apache.sis.internal.filter.sqlmm.todo.Curve_ST_StartPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.GeomColl_ST_GeometryN;
-import org.apache.sis.internal.filter.sqlmm.todo.GeomColl_ST_NumGeometries;
-import org.apache.sis.internal.filter.sqlmm.todo.Line_ST_NumPoints;
-import org.apache.sis.internal.filter.sqlmm.todo.Line_ST_PointN;
-import org.apache.sis.internal.filter.sqlmm.todo.Point_ST_ExplicitPoint;
-import org.apache.sis.internal.filter.sqlmm.todo.Point_ST_X;
-import org.apache.sis.internal.filter.sqlmm.todo.Point_ST_Y;
-import org.apache.sis.internal.filter.sqlmm.todo.Point_ST_Z;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_ExteriorRing;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_InteriorRingN;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_NumInteriorRings;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_EndPoint;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_IsClosed;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_IsRing;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Length;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_StartPoint;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_GeometryN;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_NumGeometries;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_NumPoints;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_PointN;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_ExplicitPoint;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_X;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Y;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Z;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_AsBinary;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_AsGML;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_AsText;
@@ -81,10 +81,10 @@ import org.apache.sis.internal.filter.sqlmm.todo.ST_Within;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromBinary;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromGML;
 import org.apache.sis.internal.filter.sqlmm.todo.ST_XFromText;
-import org.apache.sis.internal.filter.sqlmm.todo.Surface_ST_Area;
-import org.apache.sis.internal.filter.sqlmm.todo.Surface_ST_Centroid;
-import org.apache.sis.internal.filter.sqlmm.todo.Surface_ST_Perimeter;
-import org.apache.sis.internal.filter.sqlmm.todo.Surface_ST_PointOnSurface;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Area;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Centroid;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_Perimeter;
+import org.apache.sis.internal.filter.sqlmm.todo.ST_PointOnSurface;
 import org.apache.sis.util.ArgumentChecks;
 
 
@@ -122,22 +122,7 @@ public final class SQLMM implements FunctionRegister {
     @Override
     public Collection<String> getNames() {
         return Arrays.asList(
-                CurvePolygon_ST_ExteriorRing.NAME,
-                CurvePolygon_ST_InteriorRingN.NAME,
-                CurvePolygon_ST_NumInteriorRings.NAME,
-                Curve_ST_EndPoint.NAME,
-                Curve_ST_IsClosed.NAME,
-                Curve_ST_IsRing.NAME,
-                Curve_ST_Length.NAME,
-                Curve_ST_StartPoint.NAME,
-                GeomColl_ST_GeometryN.NAME,
-                GeomColl_ST_NumGeometries.NAME,
-                Line_ST_NumPoints.NAME,
-                Line_ST_PointN.NAME,
-                Point_ST_ExplicitPoint.NAME,
-                Point_ST_X.NAME,
-                Point_ST_Y.NAME,
-                Point_ST_Z.NAME,
+                ST_Area.NAME,
                 ST_AsBinary.NAME,
                 ST_AsGML.NAME,
                 ST_AsText.NAME,
@@ -152,27 +137,42 @@ public final class SQLMM implements FunctionRegister {
                 ST_Dimension.NAME,
                 ST_Disjoint.NAME,
                 ST_Distance.NAME,
+                ST_EndPoint.NAME,
                 ST_Envelope.NAME,
                 ST_Equals.NAME,
+                ST_ExplicitPoint.NAME,
+                ST_ExteriorRing.NAME,
                 ST_GeomCollection.NAME,
+                ST_GeometryN.NAME,
                 ST_GeometryType.NAME,
+                ST_InteriorRingN.NAME,
                 ST_Intersection.NAME,
                 ST_Intersects.NAME,
                 ST_Is3D.NAME,
+                ST_IsClosed.NAME,
                 ST_IsEmpty.NAME,
+                ST_IsRing.NAME,
                 ST_IsSimple.NAME,
                 ST_IsValid.NAME,
+                ST_Length.NAME,
                 ST_LineString.NAME,
                 ST_MultiLineString.NAME,
                 ST_MultiPoint.NAME,
                 ST_MultiPolygon.NAME,
+                ST_NumGeometries.NAME,
+                ST_NumInteriorRings.NAME,
+                ST_NumPoints.NAME,
                 ST_Overlaps.NAME,
+                ST_Perimeter.NAME,
                 ST_Point.NAME,
+                ST_PointN.NAME,
+                ST_PointOnSurface.NAME,
                 ST_Polygon.NAME,
                 ST_Relate.NAME,
                 ST_Simplify.NAME,
                 ST_SimplifyPreserveTopology.NAME,
                 ST_SRID.NAME,
+                ST_StartPoint.NAME,
                 ST_SymDifference.NAME,
                 ST_ToGeomColl.NAME,
                 ST_ToLineString.NAME,
@@ -185,6 +185,7 @@ public final class SQLMM implements FunctionRegister {
                 ST_Transform.NAME,
                 ST_Union.NAME,
                 ST_Within.NAME,
+                ST_X.NAME,
                 ST_XFromBinary.BdMPoly.NAME,
                 ST_XFromBinary.BdPoly.NAME,
                 ST_XFromBinary.GeomColl.NAME,
@@ -213,10 +214,8 @@ public final class SQLMM implements FunctionRegister {
                 ST_XFromText.MPoly.NAME,
                 ST_XFromText.Point.NAME,
                 ST_XFromText.Poly.NAME,
-                Surface_ST_Area.NAME,
-                Surface_ST_Centroid.NAME,
-                Surface_ST_Perimeter.NAME,
-                Surface_ST_PointOnSurface.NAME
+                ST_Y.NAME,
+                ST_Z.NAME
         );
     }
 
@@ -238,101 +237,100 @@ public final class SQLMM implements FunctionRegister {
         }
         try {
             switch (name) {
-                case CurvePolygon_ST_ExteriorRing.NAME:                    return new CurvePolygon_ST_ExteriorRing(parameters);
-                case CurvePolygon_ST_InteriorRingN.NAME:                    return new CurvePolygon_ST_InteriorRingN(parameters);
-                case CurvePolygon_ST_NumInteriorRings.NAME:                    return new CurvePolygon_ST_NumInteriorRings(parameters);
-                case Curve_ST_EndPoint.NAME:                    return new Curve_ST_EndPoint(parameters);
-                case Curve_ST_IsClosed.NAME:                    return new Curve_ST_IsClosed(parameters);
-                case Curve_ST_IsRing.NAME:                    return new Curve_ST_IsRing(parameters);
-                case Curve_ST_Length.NAME:                    return new Curve_ST_Length(parameters);
-                case Curve_ST_StartPoint.NAME:                    return new Curve_ST_StartPoint(parameters);
-                case GeomColl_ST_GeometryN.NAME:                    return new GeomColl_ST_GeometryN(parameters);
-                case GeomColl_ST_NumGeometries.NAME:                    return new GeomColl_ST_NumGeometries(parameters);
-                case Line_ST_NumPoints.NAME:                    return new Line_ST_NumPoints(parameters);
-                case Line_ST_PointN.NAME:                    return new Line_ST_PointN(parameters);
-                case Point_ST_ExplicitPoint.NAME:                    return new Point_ST_ExplicitPoint(parameters);
-                case Point_ST_X.NAME:                    return new Point_ST_X(parameters);
-                case Point_ST_Y.NAME:                    return new Point_ST_Y(parameters);
-                case Point_ST_Z.NAME:                    return new Point_ST_Z(parameters);
-                case ST_AsBinary.NAME:                    return new ST_AsBinary(parameters);
-                case ST_AsGML.NAME:                    return new ST_AsGML(parameters);
+                case ST_Area.NAME:                      return new ST_Area(parameters);
+                case ST_AsBinary.NAME:                  return new ST_AsBinary(parameters);
+                case ST_AsGML.NAME:                     return new ST_AsGML(parameters);
                 case ST_AsText.NAME:                    return new ST_AsText(parameters);
-                case ST_Boundary.NAME:                    return new ST_Boundary(parameters);
+                case ST_Boundary.NAME:                  return new ST_Boundary(parameters);
                 case ST_Buffer.NAME:                    return new ST_Buffer(parameters);
                 case ST_Centroid.NAME:                  return new ST_Centroid(parameters);
-                case ST_Contains.NAME:                    return new ST_Contains(parameters);
-                case ST_ConvexHull.NAME:                    return new ST_ConvexHull(parameters);
-                case ST_CoordDim.NAME:                    return new ST_CoordDim(parameters);
-                case ST_Crosses.NAME:                    return new ST_Crosses(parameters);
-                case ST_Difference.NAME:                    return new ST_Difference(parameters);
-                case ST_Dimension.NAME:                    return new ST_Dimension(parameters);
-                case ST_Disjoint.NAME:                    return new ST_Disjoint(parameters);
-                case ST_Distance.NAME:                    return new ST_Distance(parameters);
+                case ST_Contains.NAME:                  return new ST_Contains(parameters);
+                case ST_ConvexHull.NAME:                return new ST_ConvexHull(parameters);
+                case ST_CoordDim.NAME:                  return new ST_CoordDim(parameters);
+                case ST_Crosses.NAME:                   return new ST_Crosses(parameters);
+                case ST_Difference.NAME:                return new ST_Difference(parameters);
+                case ST_Dimension.NAME:                 return new ST_Dimension(parameters);
+                case ST_Disjoint.NAME:                  return new ST_Disjoint(parameters);
+                case ST_Distance.NAME:                  return new ST_Distance(parameters);
+                case ST_EndPoint.NAME:                  return new ST_EndPoint(parameters);
                 case ST_Envelope.NAME:                  return new ST_Envelope(parameters);
                 case ST_Equals.NAME:                    return new ST_Equals(parameters);
-                case ST_GeomCollection.NAME:                    return new ST_GeomCollection(parameters);
-                case ST_GeometryType.NAME:                    return new ST_GeometryType(parameters);
-                case ST_Intersection.NAME:                    return new ST_Intersection(parameters);
-                case ST_Intersects.NAME:                    return new ST_Intersects(parameters);
-                case ST_Is3D.NAME:                    return new ST_Is3D(parameters);
-                case ST_IsEmpty.NAME:                    return new ST_IsEmpty(parameters);
-                case ST_IsSimple.NAME:                    return new ST_IsSimple(parameters);
-                case ST_IsValid.NAME:                    return new ST_IsValid(parameters);
+                case ST_ExplicitPoint.NAME:             return new ST_ExplicitPoint(parameters);
+                case ST_ExteriorRing.NAME:              return new ST_ExteriorRing(parameters);
+                case ST_GeomCollection.NAME:            return new ST_GeomCollection(parameters);
+                case ST_GeometryN.NAME:                 return new ST_GeometryN(parameters);
+                case ST_GeometryType.NAME:              return new ST_GeometryType(parameters);
+                case ST_InteriorRingN.NAME:             return new ST_InteriorRingN(parameters);
+                case ST_Intersection.NAME:              return new ST_Intersection(parameters);
+                case ST_Intersects.NAME:                return new ST_Intersects(parameters);
+                case ST_Is3D.NAME:                      return new ST_Is3D(parameters);
+                case ST_IsClosed.NAME:                  return new ST_IsClosed(parameters);
+                case ST_IsEmpty.NAME:                   return new ST_IsEmpty(parameters);
+                case ST_IsRing.NAME:                    return new ST_IsRing(parameters);
+                case ST_IsSimple.NAME:                  return new ST_IsSimple(parameters);
+                case ST_IsValid.NAME:                   return new ST_IsValid(parameters);
+                case ST_Length.NAME:                    return new ST_Length(parameters);
                 case ST_LineString.NAME:                return new ST_LineString(parameters);
-                case ST_MultiLineString.NAME:                    return new ST_MultiLineString(parameters);
-                case ST_MultiPoint.NAME:                    return new ST_MultiPoint(parameters);
-                case ST_MultiPolygon.NAME:                    return new ST_MultiPolygon(parameters);
-                case ST_Overlaps.NAME:                    return new ST_Overlaps(parameters);
+                case ST_MultiLineString.NAME:           return new ST_MultiLineString(parameters);
+                case ST_MultiPoint.NAME:                return new ST_MultiPoint(parameters);
+                case ST_MultiPolygon.NAME:              return new ST_MultiPolygon(parameters);
+                case ST_NumGeometries.NAME:             return new ST_NumGeometries(parameters);
+                case ST_NumInteriorRings.NAME:          return new ST_NumInteriorRings(parameters);
+                case ST_NumPoints.NAME:                 return new ST_NumPoints(parameters);
+                case ST_Overlaps.NAME:                  return new ST_Overlaps(parameters);
+                case ST_Perimeter.NAME:                 return new ST_Perimeter(parameters);
                 case ST_Point.NAME:                     return new ST_Point(parameters);
-                case ST_Polygon.NAME:                    return new ST_Polygon(parameters);
+                case ST_PointN.NAME:                    return new ST_PointN(parameters);
+                case ST_PointOnSurface.NAME:            return new ST_PointOnSurface(parameters);
+                case ST_Polygon.NAME:                   return new ST_Polygon(parameters);
                 case ST_Relate.NAME:                    return new ST_Relate(parameters);
                 case ST_Simplify.NAME:                  return new ST_Simplify(parameters);
                 case ST_SimplifyPreserveTopology.NAME:  return new ST_SimplifyPreserveTopology(parameters);
-                case ST_SRID.NAME:                    return new ST_SRID(parameters);
-                case ST_SymDifference.NAME:                    return new ST_SymDifference(parameters);
-                case ST_ToGeomColl.NAME:                    return new ST_ToGeomColl(parameters);
-                case ST_ToLineString.NAME:                    return new ST_ToLineString(parameters);
-                case ST_ToMultiLine.NAME:                    return new ST_ToMultiLine(parameters);
-                case ST_ToMultiPoint.NAME:                    return new ST_ToMultiPoint(parameters);
-                case ST_ToMultiPolygon.NAME:                    return new ST_ToMultiPolygon(parameters);
-                case ST_ToPoint.NAME:                    return new ST_ToPoint(parameters);
-                case ST_ToPolygon.NAME:                    return new ST_ToPolygon(parameters);
-                case ST_Touches.NAME:                    return new ST_Touches(parameters);
+                case ST_SRID.NAME:                      return new ST_SRID(parameters);
+                case ST_StartPoint.NAME:                return new ST_StartPoint(parameters);
+                case ST_SymDifference.NAME:             return new ST_SymDifference(parameters);
+                case ST_ToGeomColl.NAME:                return new ST_ToGeomColl(parameters);
+                case ST_ToLineString.NAME:              return new ST_ToLineString(parameters);
+                case ST_ToMultiLine.NAME:               return new ST_ToMultiLine(parameters);
+                case ST_ToMultiPoint.NAME:              return new ST_ToMultiPoint(parameters);
+                case ST_ToMultiPolygon.NAME:            return new ST_ToMultiPolygon(parameters);
+                case ST_ToPoint.NAME:                   return new ST_ToPoint(parameters);
+                case ST_ToPolygon.NAME:                 return new ST_ToPolygon(parameters);
+                case ST_Touches.NAME:                   return new ST_Touches(parameters);
                 case ST_Transform.NAME:                 return new ST_Transform(parameters);
-                case ST_Union.NAME:                    return new ST_Union(parameters);
+                case ST_Union.NAME:                     return new ST_Union(parameters);
                 case ST_Within.NAME:                    return new ST_Within(parameters);
-                case ST_XFromBinary.BdMPoly.NAME:                    return new ST_XFromBinary.BdMPoly(parameters);
-                case ST_XFromBinary.BdPoly.NAME:                    return new ST_XFromBinary.BdPoly(parameters);
-                case ST_XFromBinary.GeomColl.NAME:                    return new ST_XFromBinary.GeomColl(parameters);
-                case ST_XFromBinary.Geom.NAME:                    return new ST_XFromBinary.Geom(parameters);
-                case ST_XFromBinary.Line.NAME:                    return new ST_XFromBinary.Line(parameters);
-                case ST_XFromBinary.MLine.NAME:                    return new ST_XFromBinary.MLine(parameters);
-                case ST_XFromBinary.MPoint.NAME:                    return new ST_XFromBinary.MPoint(parameters);
-                case ST_XFromBinary.MPoly.NAME:                    return new ST_XFromBinary.MPoly(parameters);
-                case ST_XFromBinary.Point.NAME:                    return new ST_XFromBinary.Point(parameters);
-                case ST_XFromBinary.Poly.NAME:                    return new ST_XFromBinary.Poly(parameters);
-                case ST_XFromGML.GeomColl.NAME:                    return new ST_XFromGML.GeomColl(parameters);
-                case ST_XFromGML.Geom.NAME:                    return new ST_XFromGML.Geom(parameters);
-                case ST_XFromGML.Line.NAME:                    return new ST_XFromGML.Line(parameters);
-                case ST_XFromGML.MLine.NAME:                    return new ST_XFromGML.MLine(parameters);
-                case ST_XFromGML.MPoint.NAME:                    return new ST_XFromGML.MPoint(parameters);
-                case ST_XFromGML.MPoly.NAME:                    return new ST_XFromGML.MPoly(parameters);
-                case ST_XFromGML.Point.NAME:                    return new ST_XFromGML.Point(parameters);
-                case ST_XFromGML.Poly.NAME:                    return new ST_XFromGML.Poly(parameters);
-                case ST_XFromText.BdMPoly.NAME:                    return new ST_XFromText.BdMPoly(parameters);
-                case ST_XFromText.BdPoly.NAME:                    return new ST_XFromText.BdPoly(parameters);
-                case ST_XFromText.GeomColl.NAME:                    return new ST_XFromText.GeomColl(parameters);
-                case ST_XFromText.Geom.NAME:                    return new ST_XFromText.Geom(parameters);
-                case ST_XFromText.Line.NAME:                    return new ST_XFromText.Line(parameters);
-                case ST_XFromText.MLine.NAME:                    return new ST_XFromText.MLine(parameters);
-                case ST_XFromText.MPoint.NAME:                    return new ST_XFromText.MPoint(parameters);
-                case ST_XFromText.MPoly.NAME:                    return new ST_XFromText.MPoly(parameters);
-                case ST_XFromText.Point.NAME:                    return new ST_XFromText.Point(parameters);
-                case ST_XFromText.Poly.NAME:                    return new ST_XFromText.Poly(parameters);
-                case Surface_ST_Area.NAME:                    return new Surface_ST_Area(parameters);
-                //case Surface_ST_Centroid.NAME:                    return new Surface_ST_Centroid(parameters);
-                case Surface_ST_Perimeter.NAME:                    return new Surface_ST_Perimeter(parameters);
-                case Surface_ST_PointOnSurface.NAME:                    return new Surface_ST_PointOnSurface(parameters);
+                case ST_X.NAME:                         return new ST_X(parameters);
+                case ST_XFromBinary.BdMPoly.NAME:       return new ST_XFromBinary.BdMPoly(parameters);
+                case ST_XFromBinary.BdPoly.NAME:        return new ST_XFromBinary.BdPoly(parameters);
+                case ST_XFromBinary.GeomColl.NAME:      return new ST_XFromBinary.GeomColl(parameters);
+                case ST_XFromBinary.Geom.NAME:          return new ST_XFromBinary.Geom(parameters);
+                case ST_XFromBinary.Line.NAME:          return new ST_XFromBinary.Line(parameters);
+                case ST_XFromBinary.MLine.NAME:         return new ST_XFromBinary.MLine(parameters);
+                case ST_XFromBinary.MPoint.NAME:        return new ST_XFromBinary.MPoint(parameters);
+                case ST_XFromBinary.MPoly.NAME:         return new ST_XFromBinary.MPoly(parameters);
+                case ST_XFromBinary.Point.NAME:         return new ST_XFromBinary.Point(parameters);
+                case ST_XFromBinary.Poly.NAME:          return new ST_XFromBinary.Poly(parameters);
+                case ST_XFromGML.GeomColl.NAME:         return new ST_XFromGML.GeomColl(parameters);
+                case ST_XFromGML.Geom.NAME:             return new ST_XFromGML.Geom(parameters);
+                case ST_XFromGML.Line.NAME:             return new ST_XFromGML.Line(parameters);
+                case ST_XFromGML.MLine.NAME:            return new ST_XFromGML.MLine(parameters);
+                case ST_XFromGML.MPoint.NAME:           return new ST_XFromGML.MPoint(parameters);
+                case ST_XFromGML.MPoly.NAME:            return new ST_XFromGML.MPoly(parameters);
+                case ST_XFromGML.Point.NAME:            return new ST_XFromGML.Point(parameters);
+                case ST_XFromGML.Poly.NAME:             return new ST_XFromGML.Poly(parameters);
+                case ST_XFromText.BdMPoly.NAME:         return new ST_XFromText.BdMPoly(parameters);
+                case ST_XFromText.BdPoly.NAME:          return new ST_XFromText.BdPoly(parameters);
+                case ST_XFromText.GeomColl.NAME:        return new ST_XFromText.GeomColl(parameters);
+                case ST_XFromText.Geom.NAME:            return new ST_XFromText.Geom(parameters);
+                case ST_XFromText.Line.NAME:            return new ST_XFromText.Line(parameters);
+                case ST_XFromText.MLine.NAME:           return new ST_XFromText.MLine(parameters);
+                case ST_XFromText.MPoint.NAME:          return new ST_XFromText.MPoint(parameters);
+                case ST_XFromText.MPoly.NAME:           return new ST_XFromText.MPoly(parameters);
+                case ST_XFromText.Point.NAME:           return new ST_XFromText.Point(parameters);
+                case ST_XFromText.Poly.NAME:            return new ST_XFromText.Poly(parameters);
+                case ST_Y.NAME:                         return new ST_Y(parameters);
+                case ST_Z.NAME:                         return new ST_Z(parameters);
                 default: throw new IllegalArgumentException(Resources.format(Resources.Keys.UnknownFunction_1, name));
             }
         } catch (FactoryException e) {
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_LineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_LineString.java
index c05ab4b..571eb60 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_LineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/ST_LineString.java
@@ -26,6 +26,7 @@ import org.apache.sis.feature.builder.FeatureTypeBuilder;
 import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.NamedFunction;
 import org.apache.sis.internal.feature.FeatureExpression;
+import org.apache.sis.internal.filter.FilterGeometryUtils;
 import org.apache.sis.referencing.CRS;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.LineString;
@@ -116,7 +117,7 @@ final class ST_LineString extends NamedFunction implements FeatureExpression {
             }
         }
 
-        final LineString geometry = SQLMM.GF.createLineString(coords.toArray(new Coordinate[coords.size()]));
+        final LineString geometry = FilterGeometryUtils.GF.createLineString(coords.toArray(new Coordinate[coords.size()]));
         geometry.setUserData(crs);
         return geometry;
     }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
index 00c93cd..a33913c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/AbstractSpatialFunction.java
@@ -16,9 +16,8 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
-import java.util.logging.Logger;
+import org.apache.sis.internal.feature.FeatureExpression;
 import org.apache.sis.internal.filter.NamedFunction;
-import org.apache.sis.util.logging.Logging;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -28,9 +27,7 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public abstract class AbstractSpatialFunction extends NamedFunction {
-
-    protected static final Logger LOGGER = Logging.getLogger(AbstractSpatialFunction.class);
+public abstract class AbstractSpatialFunction extends NamedFunction implements FeatureExpression {
 
     public AbstractSpatialFunction(Expression[] parameters){
         super(parameters);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java
index a02a6b0..ddf3463 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Area.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Area.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Surface_ST_Area extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_Area extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Area";
 
-    public Surface_ST_Area(Expression[] parameters) {
+    public ST_Area(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class Surface_ST_Area extends AbstractAccessorSpatialFunction<Geome
         return geom.getArea();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
index d09cc57..a8801d2 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsBinary.java
@@ -19,7 +19,10 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.WKBWriter;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_AsBinary extends AbstractAccessorSpatialFunction<Geometry>
         return writer.write(geom);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(byte[].class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
index cfd8ff8..66b267d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsGML.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -53,4 +56,9 @@ public final class ST_AsGML extends AbstractAccessorSpatialFunction<Geometry> {
         throw new ParseException("Not implemented", 0);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(String.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
index d689445..e839d1b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_AsText.java
@@ -19,7 +19,10 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.WKTWriter;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_AsText extends AbstractAccessorSpatialFunction<Geometry> {
         return writer.write(geom);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(String.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
index 3415499..54501a2 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Boundary.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_Boundary extends AbstractAccessorSpatialFunction<Geometry>
         return bound;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
index f88775f..66c7a3d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Buffer.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -67,4 +70,9 @@ public final class ST_Buffer extends AbstractAccessorSpatialFunction<Geometry> {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java
index 4ad77b0..37900b9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Centroid.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Centroid.java
@@ -18,6 +18,10 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.locationtech.jts.geom.Point;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -32,11 +36,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Surface_ST_Centroid extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_Centroid extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Centroid";
 
-    public Surface_ST_Centroid(Expression[] parameters) {
+    public ST_Centroid(Expression[] parameters) {
         super(parameters);
     }
 
@@ -57,4 +61,9 @@ public final class Surface_ST_Centroid extends AbstractAccessorSpatialFunction<G
         return centroid;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
index 9aad95a..9f83dea 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Contains.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Contains extends AbstractBinarySpatialFunction {
         return left.contains(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
index 8ceb191..baa32da 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ConvexHull.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ConvexHull extends AbstractAccessorSpatialFunction<Geometr
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
index 14bfa4c..39ecf9b 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_CoordDim.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -57,4 +60,9 @@ public final class ST_CoordDim extends AbstractAccessorSpatialFunction<Geometry>
         return null;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
index 062533a..957b709 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Crosses.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Crosses extends AbstractBinarySpatialFunction {
         return left.crosses(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
index 2c391bd..f1d0c9c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Difference.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -50,4 +53,9 @@ public final class ST_Difference extends AbstractBinarySpatialFunction {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
index 731ee2c..f197595 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Dimension.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -52,4 +55,9 @@ public final class ST_Dimension extends AbstractAccessorSpatialFunction<Geometry
         return geom.getDimension();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
index d0f99ab..ec6116e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Disjoint.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Disjoint extends AbstractBinarySpatialFunction {
         return left.disjoint(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
index 2b917b9..5ab2c7c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Distance.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Distance extends AbstractBinarySpatialFunction {
         return d;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java
index 29a20c4..fe176b1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_EndPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_EndPoint.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Curve_ST_EndPoint extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_EndPoint extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_EndPoint";
 
-    public Curve_ST_EndPoint(Expression[] parameters) {
+    public ST_EndPoint(Expression[] parameters) {
         super(parameters);
     }
 
@@ -55,4 +58,9 @@ public final class Curve_ST_EndPoint extends AbstractAccessorSpatialFunction<Lin
         return pt;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
index 25dae29..e1aa429 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Envelope.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_Envelope extends AbstractAccessorSpatialFunction<Geometry>
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
index 46d491c..842fbd1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Equals.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Equals extends AbstractBinarySpatialFunction {
         return left.equals(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java
index 8188c60..e45e474 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_ExplicitPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExplicitPoint.java
@@ -21,6 +21,9 @@ import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -32,11 +35,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Point_ST_ExplicitPoint extends AbstractAccessorSpatialFunction<Point> {
+public final class ST_ExplicitPoint extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_ExplicitPoint";
 
-    public Point_ST_ExplicitPoint(Expression[] parameters) {
+    public ST_ExplicitPoint(Expression[] parameters) {
         super(parameters);
     }
 
@@ -60,4 +63,9 @@ public final class Point_ST_ExplicitPoint extends AbstractAccessorSpatialFunctio
         return values;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setMinimumOccurs(0).setMaximumOccurs(Integer.MAX_VALUE).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java
index 15dd7a4..4dd6631 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_ExteriorRing.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ExteriorRing.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,11 +33,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class CurvePolygon_ST_ExteriorRing extends AbstractAccessorSpatialFunction<Polygon> {
+public final class ST_ExteriorRing extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_ExteriorRing";
 
-    public CurvePolygon_ST_ExteriorRing(Expression[] parameters) {
+    public ST_ExteriorRing(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class CurvePolygon_ST_ExteriorRing extends AbstractAccessorSpatialF
         ring.setSRID(geom.getSRID());
         return ring;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(LineString.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
index 1a61c87..f5169b9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeomCollection.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.GeometryCollection;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -24,14 +27,14 @@ import org.opengis.filter.expression.Expression;
  *
  * @author Johann Sorel (Geomatys)
  * @version 2.0
- * @since   2.0
+ * @since 2.0
  * @module
  */
-public final class ST_GeomCollection extends AbstractGeomConstructor{
+public final class ST_GeomCollection extends AbstractGeomConstructor {
 
     public static final String NAME = "ST_GeomCollection";
 
-    public ST_GeomCollection(Expression[] parameters){
+    public ST_GeomCollection(Expression[] parameters) {
         super(parameters);
     }
 
@@ -44,4 +47,9 @@ public final class ST_GeomCollection extends AbstractGeomConstructor{
     protected Class<GeometryCollection> getExpectedClass() {
         return GeometryCollection.class;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(GeometryCollection.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java
similarity index 80%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java
index c2d4410..1705733 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_GeometryN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryN.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,11 +33,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class GeomColl_ST_GeometryN extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_GeometryN extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_GeometryN";
 
-    public GeomColl_ST_GeometryN(Expression[] parameters) {
+    public ST_GeometryN(Expression[] parameters) {
         super(parameters);
     }
 
@@ -66,4 +69,9 @@ public final class GeomColl_ST_GeometryN extends AbstractAccessorSpatialFunction
         return sub;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
index 663a24a..dceffe1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_GeometryType.java
@@ -28,6 +28,9 @@ import java.text.ParseException;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -79,4 +82,9 @@ public final class ST_GeometryType extends AbstractAccessorSpatialFunction<Geome
         return null;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(String.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java
similarity index 79%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java
index c9c5d11..0050168 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_InteriorRingN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_InteriorRingN.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,11 +33,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class CurvePolygon_ST_InteriorRingN extends AbstractAccessorSpatialFunction<Polygon> {
+public final class ST_InteriorRingN extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_InteriorRingN";
 
-    public CurvePolygon_ST_InteriorRingN(Expression[] parameters) {
+    public ST_InteriorRingN(Expression[] parameters) {
         super(parameters);
     }
 
@@ -55,4 +58,9 @@ public final class CurvePolygon_ST_InteriorRingN extends AbstractAccessorSpatial
         ring.setSRID(geom.getSRID());
         return ring;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(LineString.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
index 6dd4c34..5bed5d5 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersection.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -50,4 +53,9 @@ public final class ST_Intersection extends AbstractBinarySpatialFunction {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
index c54dcf8..5588af2 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Intersects.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -49,4 +52,9 @@ public final class ST_Intersects extends AbstractBinarySpatialFunction {
         return left.intersects(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
index 64c6476..6383e54 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Is3D.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -58,4 +61,9 @@ public final class ST_Is3D extends AbstractAccessorSpatialFunction<Geometry> {
         return null;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java
index 2b17b72..6cea4a3 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsClosed.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsClosed.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Curve_ST_IsClosed extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_IsClosed extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_IsClosed";
 
-    public Curve_ST_IsClosed(Expression[] parameters) {
+    public ST_IsClosed(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class Curve_ST_IsClosed extends AbstractAccessorSpatialFunction<Lin
         return geom.isClosed();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
index 5cc7308..0cb3ad7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsEmpty.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -52,4 +55,9 @@ public final class ST_IsEmpty extends AbstractAccessorSpatialFunction<Geometry>
         return geom.isEmpty();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java
index c213ace..509189c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_IsRing.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsRing.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Curve_ST_IsRing extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_IsRing extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_IsRing";
 
-    public Curve_ST_IsRing(Expression[] parameters) {
+    public ST_IsRing(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class Curve_ST_IsRing extends AbstractAccessorSpatialFunction<LineS
         return geom.isRing();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
index 2c711de..1829d26 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsSimple.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -53,4 +56,9 @@ public final class ST_IsSimple extends AbstractAccessorSpatialFunction<Geometry>
         return geom.isSimple();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
index c0064e0..66098df 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_IsValid.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -52,4 +55,9 @@ public final class ST_IsValid extends AbstractAccessorSpatialFunction<Geometry>
         return geom.isValid();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java
index c262ce6..efeb4d8 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_Length.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Length.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Curve_ST_Length extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_Length extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Length";
 
-    public Curve_ST_Length(Expression[] parameters) {
+    public ST_Length(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class Curve_ST_Length extends AbstractAccessorSpatialFunction<Geome
         return geom.getLength();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
index a4b18c2..cf510e6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_LineString.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.LineString;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -44,4 +47,9 @@ public final class ST_LineString extends AbstractGeomConstructor{
     protected Class<LineString> getExpectedClass() {
         return LineString.class;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(LineString.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
index 0667ccb..003b81f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiLineString.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiLineString;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -44,4 +47,9 @@ public final class ST_MultiLineString extends AbstractGeomConstructor{
     protected Class<MultiLineString> getExpectedClass() {
         return MultiLineString.class;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiLineString.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
index 609b64c..9ad8f16 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPoint.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiPoint;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -44,4 +47,9 @@ public final class ST_MultiPoint extends AbstractGeomConstructor{
     protected Class<MultiPoint> getExpectedClass() {
         return MultiPoint.class;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiPoint.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
index 3269a74..c42b40e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_MultiPolygon.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.MultiPolygon;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -44,4 +47,9 @@ public final class ST_MultiPolygon extends AbstractGeomConstructor{
     protected Class<MultiPolygon> getExpectedClass() {
         return MultiPolygon.class;
     }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiPolygon.class).setName(NAME);
+    }
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java
index 30434ae..19a0f99 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/GeomColl_ST_NumGeometries.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumGeometries.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -29,11 +32,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class GeomColl_ST_NumGeometries extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_NumGeometries extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_NumGeometries";
 
-    public GeomColl_ST_NumGeometries(Expression[] parameters) {
+    public ST_NumGeometries(Expression[] parameters) {
         super(parameters);
     }
 
@@ -52,4 +55,9 @@ public final class GeomColl_ST_NumGeometries extends AbstractAccessorSpatialFunc
         return geom.getNumGeometries();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java
index 3ea83a8..03ff827 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/CurvePolygon_ST_NumInteriorRings.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumInteriorRings.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -31,11 +34,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class CurvePolygon_ST_NumInteriorRings extends AbstractAccessorSpatialFunction<Polygon> {
+public final class ST_NumInteriorRings extends AbstractAccessorSpatialFunction<Polygon> {
 
     public static final String NAME = "ST_NumInteriorRings";
 
-    public CurvePolygon_ST_NumInteriorRings(Expression[] parameters) {
+    public ST_NumInteriorRings(Expression[] parameters) {
         super(parameters);
     }
 
@@ -54,4 +57,9 @@ public final class CurvePolygon_ST_NumInteriorRings extends AbstractAccessorSpat
         return geom.getNumInteriorRing();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java
index 5f51805..1bd3fc0 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_NumPoints.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_NumPoints.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -29,11 +32,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Line_ST_NumPoints extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_NumPoints extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_NumPoints";
 
-    public Line_ST_NumPoints(Expression[] parameters) {
+    public ST_NumPoints(Expression[] parameters) {
         super(parameters);
     }
 
@@ -52,4 +55,9 @@ public final class Line_ST_NumPoints extends AbstractAccessorSpatialFunction<Lin
         return geom.getNumPoints();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
index 06bda2d..4e5af3c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Overlaps.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Overlaps extends AbstractBinarySpatialFunction {
         return left.overlaps(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java
similarity index 79%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java
index 436d8ce..e5b6055 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_Perimeter.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Perimeter.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -32,11 +35,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Surface_ST_Perimeter extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_Perimeter extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_Perimeter";
 
-    public Surface_ST_Perimeter(Expression[] parameters) {
+    public ST_Perimeter(Expression[] parameters) {
         super(parameters);
     }
 
@@ -56,4 +59,9 @@ public final class Surface_ST_Perimeter extends AbstractAccessorSpatialFunction<
         return geom.getLength();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
index 1528f16..d999efc 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Point.java
@@ -20,7 +20,11 @@ import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.ParseException;
 import java.math.BigDecimal;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
+import org.locationtech.jts.geom.Point;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -115,7 +119,12 @@ public final class ST_Point extends AbstractSpatialFunction{
             throw new OException("Unexpected number of arguments : "+children.size());
         }
 
-        return new OSerializableGeometry(geom);
+        return geom;
+    }
+
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
     }
 
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java
similarity index 80%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java
index f247113..dcb3cc6 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Line_ST_PointN.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointN.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -30,11 +33,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Line_ST_PointN extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_PointN extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_PointN";
 
-    public Line_ST_PointN(Expression[] parameters) {
+    public ST_PointN(Expression[] parameters) {
         super(parameters);
     }
 
@@ -66,4 +69,9 @@ public final class Line_ST_PointN extends AbstractAccessorSpatialFunction<LineSt
         return pt;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java
similarity index 78%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java
index 6f021f7..d3984d9 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Surface_ST_PointOnSurface.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_PointOnSurface.java
@@ -18,6 +18,10 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.locationtech.jts.geom.Point;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -32,11 +36,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Surface_ST_PointOnSurface extends AbstractAccessorSpatialFunction<Geometry> {
+public final class ST_PointOnSurface extends AbstractAccessorSpatialFunction<Geometry> {
 
     public static final String NAME = "ST_PointOnSurface";
 
-    public Surface_ST_PointOnSurface(Expression[] parameters) {
+    public ST_PointOnSurface(Expression[] parameters) {
         super(parameters);
     }
 
@@ -57,4 +61,9 @@ public final class Surface_ST_PointOnSurface extends AbstractAccessorSpatialFunc
         return pt;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
index 9102819..d3c80a8 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Polygon.java
@@ -16,7 +16,10 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.Polygon;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -45,4 +48,9 @@ public final class ST_Polygon extends AbstractGeomConstructor{
         return Polygon.class;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Polygon.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
index 887c88c..440733d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Relate.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -59,4 +62,9 @@ public final class ST_Relate extends AbstractBinarySpatialFunction {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
index 70fcf22..b7cb29f 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SRID.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -52,4 +55,9 @@ public final class ST_SRID extends AbstractAccessorSpatialFunction<Geometry> {
         return geom.getSRID();
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Integer.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java
similarity index 79%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java
index 7d26435..0d2c365 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Curve_ST_StartPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_StartPoint.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -33,11 +36,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Curve_ST_StartPoint extends AbstractAccessorSpatialFunction<LineString> {
+public final class ST_StartPoint extends AbstractAccessorSpatialFunction<LineString> {
 
     public static final String NAME = "ST_StartPoint";
 
-    public Curve_ST_StartPoint(Expression[] parameters) {
+    public ST_StartPoint(Expression[] parameters) {
         super(parameters);
     }
 
@@ -57,4 +60,9 @@ public final class Curve_ST_StartPoint extends AbstractAccessorSpatialFunction<L
         return pt;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
index 466eda4..981f540 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_SymDifference.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -50,4 +53,9 @@ public final class ST_SymDifference extends AbstractBinarySpatialFunction {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
index 3d1e9e7..85ec72a 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToGeomColl.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToGeomColl extends AbstractAccessorSpatialFunction<Geometr
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
index 97f7446..c796631 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToLineString.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.LineString;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToLineString extends AbstractAccessorSpatialFunction<Geome
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
index 4c47a48..1e8e89d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiLine.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiLineString;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToMultiLine extends AbstractAccessorSpatialFunction<Geomet
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiLineString.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
index 07f10ae..c99b1ee 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPoint.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPoint;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToMultiPoint extends AbstractAccessorSpatialFunction<Geome
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiPoint.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
index bb8c7dc..decf11c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToMultiPolygon.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.MultiPolygon;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToMultiPolygon extends AbstractAccessorSpatialFunction<Geo
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(MultiPolygon.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
index 7cf63ae..bcfba87 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPoint.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToPoint extends AbstractAccessorSpatialFunction<Geometry>
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Point.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
index aa3ee32..83ec999 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_ToPolygon.java
@@ -19,6 +19,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Polygon;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -55,4 +58,9 @@ public final class ST_ToPolygon extends AbstractAccessorSpatialFunction<Geometry
         return env;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Polygon.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
index 6a688d6..495c937 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Touches.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Touches extends AbstractBinarySpatialFunction {
         return left.touches(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
index c223190..4d88999 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Union.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -50,4 +53,9 @@ public final class ST_Union extends AbstractBinarySpatialFunction {
         return res;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Geometry.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
index da76aab..c02e972 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Within.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Geometry;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -48,4 +51,9 @@ public final class ST_Within extends AbstractBinarySpatialFunction {
         return left.within(right);
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Boolean.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java
index 349c5e5..4fe1946 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_X.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_X.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -29,11 +32,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Point_ST_X extends AbstractAccessorSpatialFunction<Point> {
+public final class ST_X extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_X";
 
-    public Point_ST_X(Expression[] parameters) {
+    public ST_X(Expression[] parameters) {
         super(parameters);
     }
 
@@ -52,4 +55,9 @@ public final class Point_ST_X extends AbstractAccessorSpatialFunction<Point> {
         return geom.getCoordinate().x;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java
index d70f882..10c26bc 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromBinary.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -24,8 +26,8 @@ import org.locationtech.jts.geom.LinearRing;
 import org.locationtech.jts.geom.MultiLineString;
 import org.locationtech.jts.geom.MultiPoint;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.locationtech.jts.geom.Point;
 import org.locationtech.jts.geom.Polygon;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -75,6 +77,11 @@ public abstract class ST_XFromBinary extends AbstractSpatialFunction {
         return geom;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(getExpectedClass()).setName(getName());
+    }
+
     /**
      * SQL/MM, ISO/IEC 13249-3:2011, ST_BdMPolyFromWKB. <br>
      * Return an ST_MultiPolygon value which is transformed from a BINARY LARGE
@@ -101,22 +108,20 @@ public abstract class ST_XFromBinary extends AbstractSpatialFunction {
 
         @Override
         public Geometry evaluate(Object candidate) {
-            final OSerializableGeometry sergeo = super.evaluateNow(context, candidate);
-            final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+            final MultiLineString mls = (MultiLineString) FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
 
             final LinearRing exterior;
             final LinearRing[] interiors = new LinearRing[mls.getNumGeometries() - 1];
 
-            exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+            exterior = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
             for (int i = 0; i < interiors.length; i++) {
-                interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
+                interiors[i] = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
             }
 
-            final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
-            final MultiPolygon mpoly = OrientSpatialUtilities.GF.createMultiPolygon(new Polygon[]{poly});
+            final Polygon poly = FilterGeometryUtils.GF.createPolygon(exterior, interiors);
+            final MultiPolygon mpoly = FilterGeometryUtils.GF.createMultiPolygon(new Polygon[]{poly});
             mpoly.setSRID(mls.getSRID());
-            sergeo.setGeometry(mpoly);
-            return sergeo;
+            return mpoly;
         }
     }
 
@@ -146,21 +151,19 @@ public abstract class ST_XFromBinary extends AbstractSpatialFunction {
 
         @Override
         public Geometry evaluate(Object candidate) {
-            final OSerializableGeometry sergeo = super.evaluateNow(context, candidate);
-            final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+            final MultiLineString mls = (MultiLineString) FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
 
             final LinearRing exterior;
             final LinearRing[] interiors = new LinearRing[mls.getNumGeometries() - 1];
 
-            exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+            exterior = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
             for (int i = 0; i < interiors.length; i++) {
-                interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
+                interiors[i] = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
             }
 
-            final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+            final Polygon poly = FilterGeometryUtils.GF.createPolygon(exterior, interiors);
             poly.setSRID(mls.getSRID());
-            sergeo.setGeometry(poly);
-            return sergeo;
+            return poly;
         }
     }
 
@@ -334,8 +337,8 @@ public abstract class ST_XFromBinary extends AbstractSpatialFunction {
         }
 
         @Override
-        protected Class<Point> getExpectedClass() {
-            return Point.class;
+        protected Class<org.locationtech.jts.geom.Point> getExpectedClass() {
+            return org.locationtech.jts.geom.Point.class;
         }
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java
index 953d487..4929a7a 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromGML.java
@@ -16,16 +16,17 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
 import org.locationtech.jts.geom.LineString;
 import org.locationtech.jts.geom.MultiLineString;
 import org.locationtech.jts.geom.MultiPoint;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.locationtech.jts.geom.Point;
 import org.locationtech.jts.geom.Polygon;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
-import org.opengis.util.FactoryException;
 
 /**
  *
@@ -63,13 +64,7 @@ public abstract class ST_XFromGML extends AbstractSpatialFunction {
         final Object obj = parameters.get(0).evaluate(candidate);
 
         final Geometry geom;
-        try {
-            geom = GeometrytoJTS.toJTS(String.valueOf(obj));
-        } catch (FactoryException ex) {
-            throw new OException(ex.getMessage(), ex);
-        } catch (JAXBException ex) {
-            throw new OException(ex.getMessage(), ex);
-        }
+        if (true) throw new RuntimeException("GML not supported yet");
 
         if (!getExpectedClass().isInstance(geom)) {
             warning(new Exception("GML is not of expected type : " + getExpectedClass().getSimpleName()));
@@ -84,6 +79,11 @@ public abstract class ST_XFromGML extends AbstractSpatialFunction {
         return geom;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(getExpectedClass()).setName(getName());
+    }
+
     /**
      * SQL/MM, ISO/IEC 13249-3:2011, ST_GeomCollFromGML. <br>
      * Return an ST_GeomCollection value which is transformed from a CHARACTER
@@ -252,8 +252,8 @@ public abstract class ST_XFromGML extends AbstractSpatialFunction {
         }
 
         @Override
-        protected Class<Point> getExpectedClass() {
-            return Point.class;
+        protected Class<org.locationtech.jts.geom.Point> getExpectedClass() {
+            return org.locationtech.jts.geom.Point.class;
         }
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java
index 6ea0b02..bfa5bba 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_XFromText.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sis.internal.filter.sqlmm.todo;
 
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.filter.FilterGeometryUtils;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -24,8 +26,8 @@ import org.locationtech.jts.geom.LinearRing;
 import org.locationtech.jts.geom.MultiLineString;
 import org.locationtech.jts.geom.MultiPoint;
 import org.locationtech.jts.geom.MultiPolygon;
-import org.locationtech.jts.geom.Point;
 import org.locationtech.jts.geom.Polygon;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -75,6 +77,11 @@ public abstract class ST_XFromText extends AbstractSpatialFunction {
         return geom;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(getExpectedClass()).setName(getName());
+    }
+
     /**
      * SQL/MM, ISO/IEC 13249-3:2011, ST_BdMPolyFromText. <br>
      * Return an ST_MultiPolygon value which is transformed from a CHARACTER
@@ -101,22 +108,20 @@ public abstract class ST_XFromText extends AbstractSpatialFunction {
 
         @Override
         public Geometry evaluate(Object candidate) {
-            final OSerializableGeometry sergeo = super.evaluateNow(context, candidate);
-            final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+            final MultiLineString mls = (MultiLineString) FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
 
             final LinearRing exterior;
             final LinearRing[] interiors = new LinearRing[mls.getNumGeometries() - 1];
 
-            exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+            exterior = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
             for (int i = 0; i < interiors.length; i++) {
-                interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
+                interiors[i] = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
             }
 
-            final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
-            final MultiPolygon mpoly = OrientSpatialUtilities.GF.createMultiPolygon(new Polygon[]{poly});
+            final Polygon poly = FilterGeometryUtils.GF.createPolygon(exterior, interiors);
+            final MultiPolygon mpoly = FilterGeometryUtils.GF.createMultiPolygon(new Polygon[]{poly});
             mpoly.setSRID(mls.getSRID());
-            sergeo.setGeometry(mpoly);
-            return sergeo;
+            return mpoly;
         }
     }
 
@@ -146,21 +151,19 @@ public abstract class ST_XFromText extends AbstractSpatialFunction {
 
         @Override
         public Geometry evaluate(Object candidate) {
-            final OSerializableGeometry sergeo = super.evaluateNow(context, candidate);
-            final MultiLineString mls = (MultiLineString) sergeo.getGeometry();
+            final MultiLineString mls = (MultiLineString) FilterGeometryUtils.toGeometry(candidate, parameters.get(0));
 
             final LinearRing exterior;
             final LinearRing[] interiors = new LinearRing[mls.getNumGeometries() - 1];
 
-            exterior = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
+            exterior = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(0).getCoordinates());
             for (int i = 0; i < interiors.length; i++) {
-                interiors[i] = OrientSpatialUtilities.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
+                interiors[i] = FilterGeometryUtils.GF.createLinearRing(mls.getGeometryN(i + 1).getCoordinates());
             }
 
-            final Polygon poly = OrientSpatialUtilities.GF.createPolygon(exterior, interiors);
+            final Polygon poly = FilterGeometryUtils.GF.createPolygon(exterior, interiors);
             poly.setSRID(mls.getSRID());
-            sergeo.setGeometry(poly);
-            return sergeo;
+            return poly;
         }
     }
 
@@ -335,8 +338,8 @@ public abstract class ST_XFromText extends AbstractSpatialFunction {
         }
 
         @Override
-        protected Class<Point> getExpectedClass() {
-            return Point.class;
+        protected Class<org.locationtech.jts.geom.Point> getExpectedClass() {
+            return org.locationtech.jts.geom.Point.class;
         }
     }
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java
index 5be528a..3adfb18 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Y.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Y.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -29,11 +32,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Point_ST_Y extends AbstractAccessorSpatialFunction<Point> {
+public final class ST_Y extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_Y";
 
-    public Point_ST_Y(Expression[] parameters) {
+    public ST_Y(Expression[] parameters) {
         super(parameters);
     }
 
@@ -52,4 +55,9 @@ public final class Point_ST_Y extends AbstractAccessorSpatialFunction<Point> {
         return geom.getCoordinate().y;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java
similarity index 77%
rename from core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java
rename to core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java
index 18c3949..ac4fa05 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/Point_ST_Z.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/filter/sqlmm/todo/ST_Z.java
@@ -18,6 +18,9 @@ package org.apache.sis.internal.filter.sqlmm.todo;
 
 import org.locationtech.jts.geom.Point;
 import java.text.ParseException;
+import org.apache.sis.feature.builder.FeatureTypeBuilder;
+import org.apache.sis.feature.builder.PropertyTypeBuilder;
+import org.opengis.feature.FeatureType;
 import org.opengis.filter.expression.Expression;
 
 /**
@@ -29,11 +32,11 @@ import org.opengis.filter.expression.Expression;
  * @since   2.0
  * @module
  */
-public final class Point_ST_Z extends AbstractAccessorSpatialFunction<Point> {
+public final class ST_Z extends AbstractAccessorSpatialFunction<Point> {
 
     public static final String NAME = "ST_Z";
 
-    public Point_ST_Z(Expression[] parameters) {
+    public ST_Z(Expression[] parameters) {
         super(parameters);
     }
 
@@ -52,4 +55,9 @@ public final class Point_ST_Z extends AbstractAccessorSpatialFunction<Point> {
         return geom.getCoordinate().z;
     }
 
+    @Override
+    public PropertyTypeBuilder expectedType(FeatureType valueType, FeatureTypeBuilder addTo) {
+        return addTo.addAttribute(Double.class).setName(NAME);
+    }
+
 }


Mime
View raw message