Some columns one can query have content that could be generated while writing output. There is no standard way to tell users "this column can only be selected" and "not used in the where clause".
Known example: the access_url column in an ivoa.ObsCore service. It make sense in some implementations to dynamically generate the value users see while writing the table (eg prepend a configured base URL to an identifier value from the table).
The problem in TAP is that when a user sees a query result, they may think it is a good idea to write a query using a value they saw:
select * from ivoa.ObsCore
where access_url like 'https://example.net/%'
after seeing a value like https://example.net/srv/links?ID=ivo://example.net/foo?bar. That is not going to work as expected.
The CADC service (ivo://cadc/nrc.ca/argus) does this and currently augments the column metadata with an xtype: datatype="char" arraysize="*" xtype="clob" following an old xtype from TAP-1.0 (was adql:CLOB back then). I'm not crazy about this solution, so not proposing that we use xtype for this... I have also toyed with some functions that have this same characteristic (the logic runs while streaming output so they are not normal UDFs -- can only use them in select list).
Any solution has to fit into both the VOSI-table metadata (VODataService) and into VOTable and fit into tap_schema ... maybe it would be OK to be expressed in tap_schema only? I'm not a big fan of that, but the problem here is specific to TAP.
Some columns one can query have content that could be generated while writing output. There is no standard way to tell users "this column can only be selected" and "not used in the where clause".
Known example: the
access_urlcolumn in an ivoa.ObsCore service. It make sense in some implementations to dynamically generate the value users see while writing the table (eg prepend a configured base URL to an identifier value from the table).The problem in TAP is that when a user sees a query result, they may think it is a good idea to write a query using a value they saw:
after seeing a value like
https://example.net/srv/links?ID=ivo://example.net/foo?bar. That is not going to work as expected.The CADC service (ivo://cadc/nrc.ca/argus) does this and currently augments the column metadata with an xtype:
datatype="char" arraysize="*" xtype="clob"following an old xtype from TAP-1.0 (wasadql:CLOBback then). I'm not crazy about this solution, so not proposing that we use xtype for this... I have also toyed with some functions that have this same characteristic (the logic runs while streaming output so they are not normal UDFs -- can only use them in select list).Any solution has to fit into both the VOSI-table metadata (VODataService) and into VOTable and fit into tap_schema ... maybe it would be OK to be expressed in tap_schema only? I'm not a big fan of that, but the problem here is specific to TAP.