The way it works at present is that in order to do what you want, you have to prepare and test an SQL Statement to determine its SQLStatementType and, if it is a select statement, only then can you use it a TIBDataSet. To use it with a TIBDataSet, you then have to separately assign the SQL to the SelectSQL property and prepare the dataset query. Currently, there is no way to assign an IStatement interface to a dataset.
You can argue that this is a bug - maybe it is - but at present when you call TIBDataSet.Prepare, it will always try to initialise the fielddefs and hence the problem with setting up the metadata. There is no check at this point to make sure that the SelectSQL is an SQL statement that has metadata. The underlying point is that the assumption is that the SQL Statement will have metadata. So it works with a select query or for that matter an EXEC PROCEDURE, UPDATE, INSERT or DELETE. But it does not work with a SAVEPOINT.