docs: def description(self):
      "this is only a property so it can raise; make it an attr once it works"
      if self.lastx is None: return
      if type(self.lastx) not in (sqparse2.SelectX,sqparse2.UpdateX,sqparse2.InsertX): return
      if type(self.lastx) in (sqparse2.UpdateX,sqparse2.InsertX) and self.lastx.ret is None: return
      # at this point we know this is an operation that returns rows
      if type(self.lastx) in (sqparse2.UpdateX,sqparse2.InsertX):
        raise NotImplementedError('todo: Cursor.description for non-select')
      else: # select case
        return [description_from_colx(self.connection,self.lastx,colx) for colx in self.lastx.cols.children]