Discovered this during the work on
IGNITE-11541 (see StaticCacheDdlTest.testDropColumn).
After a quick debug I see the following: in GridQueryProcessor#onSchemaFinishDiscovery we call DynamicCacheDescriptor.schemaChangeFinish(msg), which eventually calls QuerySchema.finish(op).
Inside that method we have the following: the message.columns() collection has the field name in upper case (in the test it's "FIELD_TO_DROP"), but the entity's fields map contains lower-case names ("field_to_drop"). As a result, we do not remove the field from the query entity, this query entity is saved to the stored cache data and field re-appears after restart.