def setSpan(self, row, col, rowSpan, colSpan):
        colSpan = max(colSpan, 1)
        rowSpan = max(rowSpan, 1)
        (curRowSpan, curColSpan) = self.getSpan(row, col)
        if rowSpan!=curRowSpan or colSpan!=curColSpan:
            # Need to remove all cell except the top-left
            for r in xrange(rowSpan):
                for c in xrange(colSpan):
                    if r!=0 or c!=0:
                        self.deleteCell(row+r, col+c)

            # Take the current widget out
            curWidget = self.takeCell(row, col)

            #  ... before setting the span
            self.sheet.setSpan(row, col, rowSpan, colSpan)

            # Then put it back in
            if curWidget:
                self.setCellByWidget(row, col, curWidget)
Returns the SQL for rolling back the given savepoint.
dataset/ETHPy150Open VisTrails/VisTrails/vistrails/packages/spreadsheet/spreadsheet_tab.py/StandardWidgetSheetTab.setSpan--crossover with--dataset/ETHPy150Open dcramer/django-compositepks/django/db/backends/__init__.py/BaseDatabaseOperations.savepoint_rollback_sql