Repository: ploomber/jupysql
Pull request #781 (2023-08-03 05:43:33)

result set clean up + fix mssql edge case
## Describe your changes

- cleaning up ResultSet
- fixes an edge case when using SQL server
- updates compatibility table
- adds missing integration tests for bar and pie plots

## Issue number

Closes #X

## Checklist before requesting a review

- [ ] Performed a self-review of my code
- [ ] Formatted my code with [`pkgmt format`](https://ploomber-contributing.readthedocs.io/en/latest/contributing/pr.html#linting-formatting)
- [ ] Added [tests](https://ploomber-contributing.readthedocs.io/en/latest/contributing/pr.html#testing) (when necessary).
- [ ] Added [docstring](https://ploomber-contributing.readthedocs.io/en/latest/contributing/pr.html#documenting-changes-and-new-features) documentation and update the [changelog](https://ploomber-contributing.readthedocs.io/en/latest/contributing/pr.html#changelog) (when needed)



<!-- readthedocs-preview jupysql start -->
----
:books: Documentation preview :books:: https://jupysql--781.org.readthedocs.build/en/781/

<!-- readthedocs-preview jupysql end -->

neelasha23: Running plots on taxi dataset on datetime field is a bit slow (tried on MSSQL) :

```%%time
%sqlplot bar --table taxi --column passenger_count
```
This runs in 555ms:
```
CPU times: user 98 ms, sys: 38.1 ms, total: 136 ms
Wall time: 555 ms
```

Whereas on the `tpep_pickup_datetime` it takes 37.3secs:

<img width="829" alt="Screenshot 2023-08-04 at 3 41 01 PM" src="https://github.com/ploomber/jupysql/assets/29096135/e935efc4-e7fa-43c0-a385-923ae7aff11d">

Piechart is stuck even after running for a minute:

<img width="784" alt="Screenshot 2023-08-04 at 3 37 36 PM" src="https://github.com/ploomber/jupysql/assets/29096135/f9ec1562-7723-44c8-9878-d5be2b42a372">

Should I open another issue for this? @edublancas 

Patch:
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index df1def5..382d04d 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,5 +1,5 @@
-* @edublancas @yafimvo
+* @edublancas
 
-/.github/ @edublancas @yafimvo
+/.github/ @edublancas
 
 /doc/ @edublancas @neelasha23
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 186a7c9..bce9f5f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
 * [Fix] Fix boxplot for duckdb native ([#728](https://github.com/ploomber/jupysql/issues/728))
 * [Doc] Add Redshift tutorial
 * [Feature] Adds Redshift support for `%sqlplot boxplot`
+* [Fix] Fix error when using SQL Server with pyodbc that caused queries to fail due to multiple open result sets
 * [Fix] Improves performance when converting DuckDB results to `pandas.DataFrame`
 
 ## 0.9.0 (2023-08-01)
diff --git a/doc/integrations/compatibility.md b/doc/integrations/compatibility.md
index 086e1e0..4e6b364 100644
--- a/doc/integrations/compatibility.md
+++ b/doc/integrations/compatibility.md
@@ -11,6 +11,8 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
 - Plotting with `%%sqlplot boxplot` ✅
+- Plotting with `%%sqlplot bar` ✅
+- Plotting with `%%sqlplot pie` ✅
 - Plotting with `%%sqlplot histogram` ✅
 - Plotting with `ggplot` API ✅
 - Profiling tables with `%sqlcmd profile` ✅
@@ -21,11 +23,11 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 
 ## Snowflake
 
-**We're working on testing Snowflake, [see here](https://github.com/ploomber/jupysql/pull/336)**
-
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
 - Plotting with `%%sqlplot boxplot` ❓
+- Plotting with `%%sqlplot bar` ❓
+- Plotting with `%%sqlplot pie` ❓
 - Plotting with `%%sqlplot histogram` ❓
 - Plotting with `ggplot` API ❓
 - Profiling tables with `%sqlcmd profile` ❓
@@ -34,6 +36,21 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 - Parametrized SQL queries via `{{parameter}}` ✅
 - Interactive SQL queries via `--interact` ✅
 
+## Redshift
+
+- Running queries with `%%sql` ✅
+- CTEs with `%%sql --save NAME` ✅
+- Plotting with `%%sqlplot boxplot` ✅
+- Plotting with `%%sqlplot bar` ✅
+- Plotting with `%%sqlplot pie` ✅
+- Plotting with `%%sqlplot histogram` ✅
+- Plotting with `ggplot` API ✅
+- Profiling tables with `%sqlcmd profile` ✅
+- Listing tables with `%sqlcmd tables` ✅
+- Listing columns with `%sqlcmd columns` ✅
+- Parametrized SQL queries via `{{parameter}}` ✅
+- Interactive SQL queries via `--interact` ✅
+
 ## PostgreSQL
 
 **Almost full compatibility**
@@ -41,6 +58,8 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
 - Plotting with `%%sqlplot boxplot` ✅
+- Plotting with `%%sqlplot bar` ✅
+- Plotting with `%%sqlplot pie` ✅
 - Plotting with `%%sqlplot histogram` ✅
 - Plotting with `ggplot` API ❓
 - Profiling tables with `%sqlcmd profile` ✅
@@ -50,7 +69,6 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 - Interactive SQL queries via `--interact` ✅
 
 
-
 ## MariaDB / MySQL
 
 **Almost full compatibility**
@@ -58,6 +76,8 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
 - Plotting with `%%sqlplot boxplot` ❌
+- Plotting with `%%sqlplot bar` ❓
+- Plotting with `%%sqlplot pie` ❓
 - Plotting with `%%sqlplot histogram` ✅
 - Plotting with `ggplot` API ✅ (partial support)
 - Profiling tables with `%sqlcmd profile` ✅
@@ -70,20 +90,24 @@ These table reflects the compatibility status of JupySQL `>=0.7`
 
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
-- Plotting with `%%sqlplot boxplot` ❌
+- Plotting with `%%sqlplot boxplot` ✅
+- Plotting with `%%sqlplot bar` ✅
+- Plotting with `%%sqlplot pie` ✅
 - Plotting with `%%sqlplot histogram` ❌
-- Plotting with `ggplot` API ❌
+- Plotting with `ggplot` API ✅
 - Profiling tables with `%sqlcmd profile` ✅
 - Listing tables with `%sqlcmd tables` ✅
 - Listing columns with `%sqlcmd columns` ✅
 - Parametrized SQL queries via `{{parameter}}` ✅
 - Interactive SQL queries via `--interact` ✅
 
-## Oracle Databases
+## Oracle Database
 
 - Running queries with `%%sql` ✅
 - CTEs with `%%sql --save NAME` ✅
 - Plotting with `%%sqlplot boxplot` ❌
+- Plotting with `%%sqlplot bar` ❓
+- Plotting with `%%sqlplot pie` ❓
 - Plotting with `%%sqlplot histogram` ❌
 - Plotting with `ggplot` API ❌
 - Profiling tables with `%sqlcmd profile` ❌
diff --git a/doc/integrations/mssql.ipynb b/doc/integrations/mssql.ipynb
index 3cf06eb..be335ae 100644
--- a/doc/integrations/mssql.ipynb
+++ b/doc/integrations/mssql.ipynb
@@ -1,7 +1,6 @@
 {
  "cells": [
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "e71caf17-6e95-45ec-b839-edb6b2384a47",
    "metadata": {},
@@ -32,7 +31,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "459d2fb2-82e8-4fff-84b7-f303f4afb4d5",
    "metadata": {},
@@ -51,7 +49,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 5,
    "id": "332eec37-b2b2-4a3b-98ec-138361752f6e",
    "metadata": {
     "tags": []
@@ -68,7 +66,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "b5793627a92416360095ac149ea1805e5b958a2d4a4620a050a911fe5df7f3ac\n"
+      "00721df70ea8d5f91c792a84f28f4e0fc6c0ff53f1f4d04cb6911a3a4714deba\n"
      ]
     }
    ],
@@ -81,7 +79,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "7d18492d-e58c-4117-ac5d-602bc7e6445c",
    "metadata": {},
@@ -92,7 +89,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "7f420cee-848e-443e-997e-a6066d5fe704",
    "metadata": {},
@@ -102,7 +98,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 6,
    "id": "4cf0cbb5-a120-4b5c-8a49-8484ba5c01fa",
    "metadata": {
     "tags": []
@@ -112,8 +108,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                    NAMES\n",
-      "94fa1f440c4c   postgres   \"docker-entrypoint.s…\"   49 minutes ago   Up 49 minutes   0.0.0.0:5432->5432/tcp   postgres\n"
+      "CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n"
      ]
     }
    ],
@@ -123,7 +118,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "a8cc1b60-5d0e-45f6-bb8c-b68952a39f62",
    "metadata": {},
@@ -133,7 +127,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 7,
    "id": "83bff03a-cae7-4775-a2b6-d85ceb0ce440",
    "metadata": {
     "tags": []
@@ -143,7 +137,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "393a1a19b4bbffa70d2e58323be735b865eca8bd48b7788aa9e4c126d5d4a353\n"
+      "fabfc30490a17dc0a48313c35289218ff563070b11622bc43f07e82080b2a201\n"
      ]
     }
    ],
@@ -155,7 +149,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "489d3952-e5a8-4c11-9341-b06fef290d4d",
    "metadata": {},
@@ -165,7 +158,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 8,
    "id": "f8406efe-2939-4511-b107-daff097f3d54",
    "metadata": {
     "tags": []
@@ -175,9 +168,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS                  PORTS                              NAMES\n",
-      "393a1a19b4bb   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   1 second ago     Up Less than a second   1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n",
-      "94fa1f440c4c   postgres                           \"docker-entrypoint.s…\"   49 minutes ago   Up 49 minutes           0.0.0.0:5432->5432/tcp             postgres\n"
+      "CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                              NAMES\n",
+      "fabfc30490a1   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   5 seconds ago   Up 4 seconds   1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n"
      ]
     }
    ],
@@ -187,7 +179,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "41ed6732-6bda-4417-ae4e-8bc964196c8f",
    "metadata": {},
@@ -217,7 +208,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 9,
    "id": "27a84060-f8f1-406c-b206-898c4975809f",
    "metadata": {
     "tags": []
@@ -228,7 +219,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "3c2fe1cf-cedc-48ea-a420-36c5c0c24980",
    "metadata": {},
@@ -238,7 +228,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 10,
    "id": "c7d03c98-9cc3-4c56-a349-0e4f146115d9",
    "metadata": {
     "tags": []
@@ -250,7 +240,7 @@
        "['ODBC Driver 18 for SQL Server']"
       ]
      },
-     "execution_count": 7,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -260,7 +250,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "45386e02-c70a-44a0-9635-55e1bcdbdfc7",
    "metadata": {},
@@ -273,7 +262,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "1ad9f206-5dee-41ec-97a3-8b2622b6b433",
    "metadata": {},
@@ -285,7 +273,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 11,
    "id": "b2f987d7-c60b-480c-b31c-cd2f6562c9b8",
    "metadata": {
     "tags": []
@@ -312,7 +300,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "8f45a6f0-a9e3-4282-843f-44169b45e4c2",
    "metadata": {
@@ -325,7 +312,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "354906eb-5b76-44dc-9568-c7cda37ccfbc",
    "metadata": {},
@@ -355,19 +341,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 12,
    "id": "f62bf48d-3e7b-4d5f-99b5-4d48fce98dfc",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The sql extension is already loaded. To reload it, use:\n",
-      "  %reload_ext sql\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Found pyproject.toml from &#x27;/Users/eduardo/dev/jupysql&#x27;</span>"
+      ],
+      "text/plain": [
+       "Found pyproject.toml from '/Users/eduardo/dev/jupysql'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     }
    ],
    "source": [
@@ -376,7 +366,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "c92746b7-85d1-421b-9e70-fd7c8e4930d6",
    "metadata": {},
@@ -402,7 +391,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 13,
    "id": "aea381e9-9c61-4c15-bd09-aecb87a52e74",
    "metadata": {
     "tags": []
@@ -414,7 +403,7 @@
        "(1369769, 19)"
       ]
      },
-     "execution_count": 15,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -430,7 +419,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 14,
    "id": "f1b4ce63-5a6c-4887-91d8-7457f08b53ed",
    "metadata": {
     "tags": []
@@ -439,10 +428,10 @@
     {
      "data": {
       "text/plain": [
-       "-1"
+       "56"
       ]
      },
-     "execution_count": 30,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -454,7 +443,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "2e6183c7",
    "metadata": {},
@@ -463,7 +451,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "8ee94760-27bb-40db-9bc7-e7d5a9ec585b",
    "metadata": {},
@@ -473,19 +460,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 38,
+   "execution_count": 15,
    "id": "b4dfc187-015f-4394-b3d9-f9fc0a79c4e5",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*  mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server\n",
-      "Done.\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
+      ],
+      "text/plain": [
+       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     },
     {
      "data": {
@@ -501,13 +492,18 @@
        "            <td>100000</td>\n",
        "        </tr>\n",
        "    </tbody>\n",
-       "</table>"
+       "</table>\n",
+       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
       ],
       "text/plain": [
-       "[(100000,)]"
+       "+--------+\n",
+       "|        |\n",
+       "+--------+\n",
+       "| 100000 |\n",
+       "+--------+"
       ]
      },
-     "execution_count": 38,
+     "execution_count": 15,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -518,7 +514,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "e134d0ed-5501-4425-bd97-302b07062d57",
    "metadata": {},
@@ -528,7 +523,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 16,
    "id": "cad65f83-48d5-415e-aaeb-8fa7b4e2256c",
    "metadata": {
     "tags": []
@@ -545,9 +540,6 @@
        "    </thead>\n",
        "    <tbody>\n",
        "        <tr>\n",
-       "            <td>languages</td>\n",
-       "        </tr>\n",
-       "        <tr>\n",
        "            <td>MSreplication_options</td>\n",
        "        </tr>\n",
        "        <tr>\n",
@@ -572,7 +564,6 @@
        "+-----------------------+\n",
        "|          Name         |\n",
        "+-----------------------+\n",
-       "|       languages       |\n",
        "| MSreplication_options |\n",
        "|    spt_fallback_db    |\n",
        "|    spt_fallback_dev   |\n",
@@ -582,7 +573,7 @@
        "+-----------------------+"
       ]
      },
-     "execution_count": 43,
+     "execution_count": 16,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -592,7 +583,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "7af2e627-9089-4381-9543-d923832a2dab",
    "metadata": {},
@@ -602,7 +592,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 44,
+   "execution_count": 17,
    "id": "aa32ce39-8314-4836-919b-0cc9259c44d5",
    "metadata": {
     "tags": []
@@ -619,6 +609,7 @@
        "            <th>nullable</th>\n",
        "            <th>default</th>\n",
        "            <th>autoincrement</th>\n",
+       "            <th>comment</th>\n",
        "        </tr>\n",
        "    </thead>\n",
        "    <tbody>\n",
@@ -628,6 +619,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>VendorID</td>\n",
@@ -635,6 +627,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>tpep_pickup_datetime</td>\n",
@@ -642,6 +635,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>tpep_dropoff_datetime</td>\n",
@@ -649,6 +643,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>passenger_count</td>\n",
@@ -656,6 +651,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>trip_distance</td>\n",
@@ -663,6 +659,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>RatecodeID</td>\n",
@@ -670,6 +667,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>store_and_fwd_flag</td>\n",
@@ -677,6 +675,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>PULocationID</td>\n",
@@ -684,6 +683,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>DOLocationID</td>\n",
@@ -691,6 +691,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>payment_type</td>\n",
@@ -698,6 +699,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>fare_amount</td>\n",
@@ -705,6 +707,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>extra</td>\n",
@@ -712,6 +715,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>mta_tax</td>\n",
@@ -719,6 +723,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>tip_amount</td>\n",
@@ -726,6 +731,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>tolls_amount</td>\n",
@@ -733,6 +739,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>improvement_surcharge</td>\n",
@@ -740,6 +747,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>total_amount</td>\n",
@@ -747,6 +755,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>congestion_surcharge</td>\n",
@@ -754,6 +763,7 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "        <tr>\n",
        "            <td>airport_fee</td>\n",
@@ -761,38 +771,39 @@
        "            <td>True</td>\n",
        "            <td>None</td>\n",
        "            <td>False</td>\n",
+       "            <td>None</td>\n",
        "        </tr>\n",
        "    </tbody>\n",
        "</table>"
       ],
       "text/plain": [
-       "+-----------------------+------------------------------------------------+----------+---------+---------------+\n",
-       "|          name         |                      type                      | nullable | default | autoincrement |\n",
-       "+-----------------------+------------------------------------------------+----------+---------+---------------+\n",
-       "|         index         |                     BIGINT                     |   True   |   None  |     False     |\n",
-       "|        VendorID       |                     BIGINT                     |   True   |   None  |     False     |\n",
-       "|  tpep_pickup_datetime |                    DATETIME                    |   True   |   None  |     False     |\n",
-       "| tpep_dropoff_datetime |                    DATETIME                    |   True   |   None  |     False     |\n",
-       "|    passenger_count    |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|     trip_distance     |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|       RatecodeID      |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|   store_and_fwd_flag  | VARCHAR COLLATE \"SQL_Latin1_General_CP1_CI_AS\" |   True   |   None  |     False     |\n",
-       "|      PULocationID     |                     BIGINT                     |   True   |   None  |     False     |\n",
-       "|      DOLocationID     |                     BIGINT                     |   True   |   None  |     False     |\n",
-       "|      payment_type     |                     BIGINT                     |   True   |   None  |     False     |\n",
-       "|      fare_amount      |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|         extra         |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|        mta_tax        |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|       tip_amount      |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|      tolls_amount     |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "| improvement_surcharge |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|      total_amount     |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|  congestion_surcharge |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "|      airport_fee      |                     FLOAT                      |   True   |   None  |     False     |\n",
-       "+-----------------------+------------------------------------------------+----------+---------+---------------+"
+       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+\n",
+       "|          name         |                      type                      | nullable | default | autoincrement | comment |\n",
+       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+\n",
+       "|         index         |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
+       "|        VendorID       |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
+       "|  tpep_pickup_datetime |                    DATETIME                    |   True   |   None  |     False     |   None  |\n",
+       "| tpep_dropoff_datetime |                    DATETIME                    |   True   |   None  |     False     |   None  |\n",
+       "|    passenger_count    |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|     trip_distance     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|       RatecodeID      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|   store_and_fwd_flag  | VARCHAR COLLATE \"SQL_Latin1_General_CP1_CI_AS\" |   True   |   None  |     False     |   None  |\n",
+       "|      PULocationID     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
+       "|      DOLocationID     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
+       "|      payment_type     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
+       "|      fare_amount      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|         extra         |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|        mta_tax        |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|       tip_amount      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|      tolls_amount     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "| improvement_surcharge |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|      total_amount     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|  congestion_surcharge |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "|      airport_fee      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
+       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+"
       ]
      },
-     "execution_count": 44,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -802,7 +813,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "7a3316e7-8ba6-46ac-a46b-6fb3a0d4776c",
    "metadata": {},
@@ -812,7 +822,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 18,
    "id": "91e78151-7ae2-498d-8a19-3de0ee4781c7",
    "metadata": {
     "tags": []
@@ -824,19 +834,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 19,
    "id": "7947bc67-9170-4808-835d-b0bf82229022",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*  mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server\n",
-      "Done.\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
+      ],
+      "text/plain": [
+       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     },
     {
      "data": {
@@ -849,16 +863,21 @@
        "    </thead>\n",
        "    <tbody>\n",
        "        <tr>\n",
-       "            <td>94675</td>\n",
+       "            <td>94705</td>\n",
        "        </tr>\n",
        "    </tbody>\n",
-       "</table>"
+       "</table>\n",
+       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
       ],
       "text/plain": [
-       "[(94675,)]"
+       "+-------+\n",
+       "|       |\n",
+       "+-------+\n",
+       "| 94705 |\n",
+       "+-------+"
       ]
      },
-     "execution_count": 40,
+     "execution_count": 19,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -871,7 +890,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 20,
    "id": "73acb44a-cb1a-44ab-bfd6-42309fc1defd",
    "metadata": {
     "tags": []
@@ -883,19 +902,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 21,
    "id": "d88db9b4-1efe-4b7b-b8be-f94949b3ce69",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*  mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server\n",
-      "Done.\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
+      ],
+      "text/plain": [
+       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     },
     {
      "data": {
@@ -908,16 +931,21 @@
        "    </thead>\n",
        "    <tbody>\n",
        "        <tr>\n",
-       "            <td>5344</td>\n",
+       "            <td>5326</td>\n",
        "        </tr>\n",
        "    </tbody>\n",
-       "</table>"
+       "</table>\n",
+       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
       ],
       "text/plain": [
-       "[(5344,)]"
+       "+------+\n",
+       "|      |\n",
+       "+------+\n",
+       "| 5326 |\n",
+       "+------+"
       ]
      },
-     "execution_count": 42,
+     "execution_count": 21,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -929,7 +957,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "bfb89b06-c5c1-4ad3-bc4f-2f12071c559c",
    "metadata": {},
@@ -941,19 +968,35 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 45,
+   "execution_count": 22,
    "id": "2519b021-90bb-42f4-b637-7dc4e214eaad",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*  mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server\n",
-      "Skipping execution...\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
+      ],
+      "text/plain": [
+       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Skipping execution...</span>"
+      ],
+      "text/plain": [
+       "Skipping execution..."
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     }
    ],
    "source": [
@@ -967,19 +1010,23 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 46,
+   "execution_count": 23,
    "id": "856de699-a460-43de-8ea2-d50ea4459340",
    "metadata": {
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*  mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server\n",
-      "Done.\n"
-     ]
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
+      ],
+      "text/plain": [
+       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
     },
     {
      "data": {
@@ -995,17 +1042,22 @@
        "    <tbody>\n",
        "        <tr>\n",
        "            <td>0.0</td>\n",
-       "            <td>2.536800993124519</td>\n",
-       "            <td>18.9</td>\n",
+       "            <td>2.5377720207253898</td>\n",
+       "            <td>18.83</td>\n",
        "        </tr>\n",
        "    </tbody>\n",
-       "</table>"
+       "</table>\n",
+       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
       ],
       "text/plain": [
-       "[(0.0, 2.536800993124519, 18.9)]"
+       "+-----+--------------------+-------+\n",
+       "|     |         _1         |   _2  |\n",
+       "+-----+--------------------+-------+\n",
+       "| 0.0 | 2.5377720207253898 | 18.83 |\n",
+       "+-----+--------------------+-------+"
       ]
      },
-     "execution_count": 46,
+     "execution_count": 23,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1017,7 +1069,6 @@
    ]
   },
   {
-   "attachments": {},
    "cell_type": "markdown",
    "id": "6c315112-77c5-4a4c-ab19-55f80f43c88d",
    "metadata": {},
@@ -1027,7 +1078,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": 24,
    "id": "83aa9bcb-dd70-47a0-ae33-566b108dea1a",
    "metadata": {
     "tags": []
@@ -1037,7 +1088,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "WITH \"many_passengers\" AS (\n",
+      "WITH many_passengers AS (\n",
       "SELECT *\n",
       "FROM taxi\n",
       "WHERE passenger_count > 3\n",
@@ -1054,7 +1105,167 @@
    ]
   },
   {
-   "attachments": {},
+   "cell_type": "markdown",
+   "id": "2e6388a7-e524-4c94-8b4d-6bac99622790",
+   "metadata": {},
+   "source": [
+    "## Plotting\n",
+    "\n",
+    "### Boxplot"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "8785696d-5d86-4d22-b8a4-ac2a5d089e4c",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Plotting using saved snippet : many_passengers</span>"
+      ],
+      "text/plain": [
+       "Plotting using saved snippet : many_passengers"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<Axes: title={'center': \"'trip_distance' from 'many_passengers'\"}, ylabel='trip_distance'>"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%sqlplot boxplot --table many_passengers --column trip_distance"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4829b0be-cdb3-4185-b495-84cfa58c0d86",
+   "metadata": {},
+   "source": [
+    "### Bar"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "id": "03306421-1ae0-4b89-a524-f6d4b0a79d8a",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Removing NULLs, if there exists any from vendorid</span>"
+      ],
+      "text/plain": [
+       "Removing NULLs, if there exists any from vendorid"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<Axes: title={'center': 'taxi'}, xlabel='vendorid', ylabel='Count'>"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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rznOnDmjoUOHyuFwqFGjRho5cqTOnz/vVfPxxx/rnnvuUWhoqKKjozV37tyrelm9erXatWun0NBQderUSe+88871OWkAAFDn+DQ0nT17Vr1791ZwcLA2bNigf/zjH3rllVd02223mTVz587Va6+9piVLlmjXrl2qX7++EhMTdfHiRbNm6NChOnjwoDZt2qT169dr+/btGjVqlDnu8XjUr18/tWrVSrm5uXrppZc0c+ZMLV261KzZsWOHHn30UY0cOVIffvihBgwYoAEDBujAgQM35mIAAAC/ZjMMw/DVwadOnaoPPvhA77//frXjhmEoKipKzzzzjJ599llJUklJiSIiIpSenq4hQ4bo0KFDio2N1Z49e9S9e3dJUlZWlh544AH985//VFRUlBYvXqxf//rXcrvdstvt5rHXrFmj/Px8SdLgwYNVWlqq9evXm8fv1auXunbtqiVLlnznuXg8HjmdTpWUlMjhcHyv64LaETM109ct+MyxF5N83QIA1AnX8vvbp3ea1q5dq+7du+vnP/+5wsPDddddd+mNN94wx48ePSq3262EhARzn9PpVHx8vHJyciRJOTk5atSokRmYJCkhIUEBAQHatWuXWXPvvfeagUmSEhMTVVBQoLNnz5o1Vx6nqqbqOF9XVlYmj8fjtQEAgJuXT0PTZ599psWLF+uOO+7Qxo0bNWbMGD399NNavny5JMntdkuSIiIivN4XERFhjrndboWHh3uNBwUFqXHjxl411c1x5TG+qaZq/OvmzJkjp9NpbtHR0dd8/gAAoO7waWiqrKxUt27d9MILL+iuu+7SqFGj9NRTT1n6OMzXpk2bppKSEnM7fvy4r1sCAADXkU9DU/PmzRUbG+u1r3379iosLJQkRUZGSpKKioq8aoqKisyxyMhInTp1ymv88uXLOnPmjFdNdXNceYxvqqka/7qQkBA5HA6vDQAA3Lx8Gpp69+6tgoICr32ffPKJWrVqJUlq3bq1IiMjlZ2dbY57PB7t2rVLLpdLkuRyuVRcXKzc3FyzZvPmzaqsrFR8fLxZs337dl26dMms2bRpk9q2bWt+U8/lcnkdp6qm6jgAAODW5tPQNHHiRO3cuVMvvPCCjhw5ooyMDC1dulQpKSmSJJvNpgkTJuj555/X2rVrtX//fj3++OOKiorSgAEDJP3rztT999+vp556Srt379YHH3ygsWPHasiQIYqKipIkPfbYY7Lb7Ro5cqQOHjyolStXasGCBUpNTTV7GT9+vLKysvTKK68oPz9fM2fO1N69ezV27Ngbfl0AAID/CfLlwXv06KG3335b06ZN0+zZs9W6dWvNnz9fQ4cONWsmT56s0tJSjRo1SsXFxfrRj36krKwshYaGmjVvvfWWxo4dq759+yogIECDBg3Sa6+9Zo47nU69++67SklJUVxcnJo2baq0tDSvtZzuvvtuZWRkaPr06Xruued0xx13aM2aNerYseONuRgAAMCv+XSdppsJ6zT5H9ZpAgB8lzqzThMAAEBdQWgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACzwaWiaOXOmbDab19auXTtz/OLFi0pJSVGTJk3UoEEDDRo0SEVFRV5zFBYWKikpSfXq1VN4eLgmTZqky5cve9Vs3bpV3bp1U0hIiNq0aaP09PSrelm0aJFiYmIUGhqq+Ph47d69+7qcMwAAqJt8fqepQ4cOOnnypLn9/e9/N8cmTpyodevWafXq1dq2bZtOnDihgQMHmuMVFRVKSkpSeXm5duzYoeXLlys9PV1paWlmzdGjR5WUlKQ+ffooLy9PEyZM0JNPPqmNGzeaNStXrlRqaqpmzJihffv2qUuXLkpMTNSpU6duzEUAAAB+z2YYhuGrg8+cOVNr1qxRXl7eVWMlJSVq1qyZMjIy9Mgjj0iS8vPz1b59e+Xk5KhXr17asGGDHnzwQZ04cUIRERGSpCVLlmjKlCk6ffq07Ha7pkyZoszMTB04cMCce8iQISouLlZWVpYkKT4+Xj169NDChQslSZWVlYqOjta4ceM0depUS+fi8XjkdDpVUlIih8PxfS4LaknM1Exft+Azx15M8nULAFAnXMvvb5/faTp8+LCioqJ0++23a+jQoSosLJQk5ebm6tKlS0pISDBr27Vrp5YtWyonJ0eSlJOTo06dOpmBSZISExPl8Xh08OBBs+bKOapqquYoLy9Xbm6uV01AQIASEhLMmuqUlZXJ4/F4bQAA4Obl09AUHx+v9PR0ZWVlafHixTp69KjuuecenTt3Tm63W3a7XY0aNfJ6T0REhNxutyTJ7XZ7Baaq8aqxb6vxeDy6cOGCvvjiC1VUVFRbUzVHdebMmSOn02lu0dHRNboGAACgbgjy5cH79+9v/ty5c2fFx8erVatWWrVqlcLCwnzY2XebNm2aUlNTzdcej4fgBADATcznH89dqVGjRrrzzjt15MgRRUZGqry8XMXFxV41RUVFioyMlCRFRkZe9W26qtffVeNwOBQWFqamTZsqMDCw2pqqOaoTEhIih8PhtQEAgJuXX4Wm8+fP69NPP1Xz5s0VFxen4OBgZWdnm+MFBQUqLCyUy+WSJLlcLu3fv9/rW26bNm2Sw+FQbGysWXPlHFU1VXPY7XbFxcV51VRWVio7O9usAQAA8GloevbZZ7Vt2zYdO3ZMO3bs0M9+9jMFBgbq0UcfldPp1MiRI5WamqotW7YoNzdXw4cPl8vlUq9evSRJ/fr1U2xsrIYNG6aPPvpIGzdu1PTp05WSkqKQkBBJ0ujRo/XZZ59p8uTJys/P1+uvv65Vq1Zp4sSJZh+pqal64403tHz5ch06dEhjxoxRaWmphg8f7pPrAgAA/I9Pn2n65z//qUcffVRffvmlmjVrph/96EfauXOnmjVrJkmaN2+eAgICNGjQIJWVlSkxMVGvv/66+f7AwECtX79eY8aMkcvlUv369ZWcnKzZs2ebNa1bt1ZmZqYmTpyoBQsWqEWLFnrzzTeVmJho1gwePFinT59WWlqa3G63unbtqqysrKseDgcAALcun67TdDNhnSb/wzpNAIDvUqfWaQIAAKgLCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAv8JjS9+OKLstlsmjBhgrnv4sWLSklJUZMmTdSgQQMNGjRIRUVFXu8rLCxUUlKS6tWrp/DwcE2aNEmXL1/2qtm6dau6deumkJAQtWnTRunp6Vcdf9GiRYqJiVFoaKji4+O1e/fu63GaAACgjvKL0LRnzx794Q9/UOfOnb32T5w4UevWrdPq1au1bds2nThxQgMHDjTHKyoqlJSUpPLycu3YsUPLly9Xenq60tLSzJqjR48qKSlJffr0UV5eniZMmKAnn3xSGzduNGtWrlyp1NRUzZgxQ/v27VOXLl2UmJioU6dOXf+TBwAAdYLNMAzDlw2cP39e3bp10+uvv67nn39eXbt21fz581VSUqJmzZopIyNDjzzyiCQpPz9f7du3V05Ojnr16qUNGzbowQcf1IkTJxQRESFJWrJkiaZMmaLTp0/LbrdrypQpyszM1IEDB8xjDhkyRMXFxcrKypIkxcfHq0ePHlq4cKEkqbKyUtHR0Ro3bpymTp1q6Tw8Ho+cTqdKSkrkcDhq8xKhhmKmZvq6BZ859mKSr1sAgDrhWn5/+/xOU0pKipKSkpSQkOC1Pzc3V5cuXfLa365dO7Vs2VI5OTmSpJycHHXq1MkMTJKUmJgoj8ejgwcPmjVfnzsxMdGco7y8XLm5uV41AQEBSkhIMGuqU1ZWJo/H47UBAICbV5AvD75ixQrt27dPe/bsuWrM7XbLbrerUaNGXvsjIiLkdrvNmisDU9V41di31Xg8Hl24cEFnz55VRUVFtTX5+fnf2PucOXM0a9YsaycKAADqPJ/daTp+/LjGjx+vt956S6Ghob5qo8amTZumkpISczt+/LivWwIAANeRz0JTbm6uTp06pW7duikoKEhBQUHatm2bXnvtNQUFBSkiIkLl5eUqLi72el9RUZEiIyMlSZGRkVd9m67q9XfVOBwOhYWFqWnTpgoMDKy2pmqO6oSEhMjhcHhtAADg5lWj0HT77bfryy+/vGp/cXGxbr/9dktz9O3bV/v371deXp65de/eXUOHDjV/Dg4OVnZ2tvmegoICFRYWyuVySZJcLpf279/v9S23TZs2yeFwKDY21qy5co6qmqo57Ha74uLivGoqKyuVnZ1t1gAAANTomaZjx46poqLiqv1lZWX6/PPPLc3RsGFDdezY0Wtf/fr11aRJE3P/yJEjlZqaqsaNG8vhcGjcuHFyuVzq1auXJKlfv36KjY3VsGHDNHfuXLndbk2fPl0pKSkKCQmRJI0ePVoLFy7U5MmTNWLECG3evFmrVq1SZub/fbMqNTVVycnJ6t69u3r27Kn58+ertLRUw4cPr8nlAQAAN6FrCk1r1641f964caOcTqf5uqKiQtnZ2YqJiam15ubNm6eAgAANGjRIZWVlSkxM1Ouvv26OBwYGav369RozZoxcLpfq16+v5ORkzZ4926xp3bq1MjMzNXHiRC1YsEAtWrTQm2++qcTERLNm8ODBOn36tNLS0uR2u9W1a1dlZWVd9XA4AAC4dV3TOk0BAf/6NM9ms+nrbwsODlZMTIxeeeUVPfjgg7XbZR3AOk3+h3WaAADf5Vp+f1/TnabKykpJ/7p7s2fPHjVt2rTmXQIAANQhNXqm6ejRo7XdBwAAgF+r8eKW2dnZys7O1qlTp8w7UFX++Mc/fu/GAAAA/EmNQtOsWbM0e/Zsde/eXc2bN5fNZqvtvgAAAPxKjULTkiVLlJ6ermHDhtV2PwAAAH6pRotblpeX6+67767tXgAAAPxWjULTk08+qYyMjNruBQAAwG/V6OO5ixcvaunSpXrvvffUuXNnBQcHe42/+uqrtdIcAACAv6hRaPr444/VtWtXSdKBAwe8xngoHAAA3IxqFJq2bNlS230AAAD4tRo90wQAAHCrqdGdpj59+nzrx3CbN2+ucUMAAAD+qEahqep5piqXLl1SXl6eDhw4oOTk5NroCwAAwK/UKDTNmzev2v0zZ87U+fPnv1dDAAAA/qhWn2n6xS9+wd+dAwAAN6VaDU05OTkKDQ2tzSkBAAD8Qo0+nhs4cKDXa8MwdPLkSe3du1e/+c1vaqUxAAAAf1Kj0OR0Or1eBwQEqG3btpo9e7b69etXK40BAAD4kxqFpmXLltV2HwAAAH6tRqGpSm5urg4dOiRJ6tChg+66665aaQoAAMDf1Cg0nTp1SkOGDNHWrVvVqFEjSVJxcbH69OmjFStWqFmzZrXZIwAAgM/V6Ntz48aN07lz53Tw4EGdOXNGZ86c0YEDB+TxePT000/Xdo8AAAA+V6M7TVlZWXrvvffUvn17c19sbKwWLVrEg+AAAOCmVKM7TZWVlQoODr5qf3BwsCorK793UwAAAP6mRqHpvvvu0/jx43XixAlz3+eff66JEyeqb9++tdYcAACAv6hRaFq4cKE8Ho9iYmL0wx/+UD/84Q/VunVreTwe/f73v6/tHgEAAHyuRs80RUdHa9++fXrvvfeUn58vSWrfvr0SEhJqtTkAAAB/cU13mjZv3qzY2Fh5PB7ZbDb99Kc/1bhx4zRu3Dj16NFDHTp00Pvvv3+9egUAAPCZawpN8+fP11NPPSWHw3HVmNPp1C9/+Uu9+uqrtdYcAACAv7im0PTRRx/p/vvv/8bxfv36KTc393s3BQAA4G+uKTQVFRVVu9RAlaCgIJ0+ffp7NwUAAOBvrik0/eAHP9CBAwe+cfzjjz9W8+bNv3dTAAAA/uaaQtMDDzyg3/zmN7p48eJVYxcuXNCMGTP04IMP1lpzAAAA/uKalhyYPn26/vrXv+rOO+/U2LFj1bZtW0lSfn6+Fi1apIqKCv3617++Lo0CAAD40jWFpoiICO3YsUNjxozRtGnTZBiGJMlmsykxMVGLFi1SRETEdWkUAADAl655cctWrVrpnXfe0dmzZ3XkyBEZhqE77rhDt9122/XoDwAAwC/UaEVwSbrtttvUo0eP2uwFAADAb9Xob88BAADcaghNAAAAFhCaAAAALKjxM021YfHixVq8eLGOHTsmSerQoYPS0tLUv39/SdLFixf1zDPPaMWKFSorK1NiYqJef/11r2/oFRYWasyYMdqyZYsaNGig5ORkzZkzR0FB/3dqW7duVWpqqg4ePKjo6GhNnz5dTzzxhFcvixYt0ksvvSS3260uXbro97//vXr27Hndr4FVMVMzfd2CTxx7McnXLQAAIMnHd5patGihF198Ubm5udq7d6/uu+8+Pfzwwzp48KAkaeLEiVq3bp1Wr16tbdu26cSJExo4cKD5/oqKCiUlJam8vFw7duzQ8uXLlZ6errS0NLPm6NGjSkpKUp8+fZSXl6cJEyboySef1MaNG82alStXKjU1VTNmzNC+ffvUpUsXJSYm6tSpUzfuYgAAAL9mM6oWW/ITjRs31ksvvaRHHnlEzZo1U0ZGhh555BFJ/1pEs3379srJyVGvXr20YcMGPfjggzpx4oR592nJkiWaMmWKTp8+LbvdrilTpigzM9Prz78MGTJExcXFysrKkiTFx8erR48eWrhwoSSpsrJS0dHRGjdunKZOnWqpb4/HI6fTqZKSEjkcjtq8JJK401QTt+o1k7hDBwBWXcvvb795pqmiokIrVqxQaWmpXC6XcnNzdenSJSUkJJg17dq1U8uWLZWTkyNJysnJUadOnbw+rktMTJTH4zHvVuXk5HjNUVVTNUd5eblyc3O9agICApSQkGDWVKesrEwej8drAwAANy+fh6b9+/erQYMGCgkJ0ejRo/X2228rNjZWbrdbdrtdjRo18qqPiIiQ2+2WJLnd7qtWIK96/V01Ho9HFy5c0BdffKGKiopqa6rmqM6cOXPkdDrNLTo6ukbnDwAA6gafh6a2bdsqLy9Pu3bt0pgxY5ScnKx//OMfvm7rO02bNk0lJSXmdvz4cV+3BAAAriOffntOkux2u9q0aSNJiouL0549e7RgwQINHjxY5eXlKi4u9rrbVFRUpMjISElSZGSkdu/e7TVfUVGROVb1v1X7rqxxOBwKCwtTYGCgAgMDq62pmqM6ISEhCgkJqdlJAwCAOsfnd5q+rrKyUmVlZYqLi1NwcLCys7PNsYKCAhUWFsrlckmSXC6X9u/f7/Utt02bNsnhcCg2NtasuXKOqpqqOex2u+Li4rxqKisrlZ2dbdYAAAD49E7TtGnT1L9/f7Vs2VLnzp1TRkaGtm7dqo0bN8rpdGrkyJFKTU1V48aN5XA4NG7cOLlcLvXq1UuS1K9fP8XGxmrYsGGaO3eu3G63pk+frpSUFPMu0OjRo7Vw4UJNnjxZI0aM0ObNm7Vq1SplZv7fN6tSU1OVnJys7t27q2fPnpo/f75KS0s1fPhwn1wXAADgf3wamk6dOqXHH39cJ0+elNPpVOfOnbVx40b99Kc/lSTNmzdPAQEBGjRokNfillUCAwO1fv16jRkzRi6XS/Xr11dycrJmz55t1rRu3VqZmZmaOHGiFixYoBYtWujNN99UYmKiWTN48GCdPn1aaWlpcrvd6tq1q7Kysq56OBwAANy6/G6dprqKdZquD9ZpqhnWaQIAa+rkOk0AAAD+jNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFjg09A0Z84c9ejRQw0bNlR4eLgGDBiggoICr5qLFy8qJSVFTZo0UYMGDTRo0CAVFRV51RQWFiopKUn16tVTeHi4Jk2apMuXL3vVbN26Vd26dVNISIjatGmj9PT0q/pZtGiRYmJiFBoaqvj4eO3evbvWzxkAANRNPg1N27ZtU0pKinbu3KlNmzbp0qVL6tevn0pLS82aiRMnat26dVq9erW2bdumEydOaODAgeZ4RUWFkpKSVF5erh07dmj58uVKT09XWlqaWXP06FElJSWpT58+ysvL04QJE/Tkk09q48aNZs3KlSuVmpqqGTNmaN++ferSpYsSExN16tSpG3MxAACAX7MZhmH4uokqp0+fVnh4uLZt26Z7771XJSUlatasmTIyMvTII49IkvLz89W+fXvl5OSoV69e2rBhgx588EGdOHFCERERkqQlS5ZoypQpOn36tOx2u6ZMmaLMzEwdOHDAPNaQIUNUXFysrKwsSVJ8fLx69OihhQsXSpIqKysVHR2tcePGaerUqd/Zu8fjkdPpVElJiRwOR21fGsVMzaz1OeuCYy8m1fi9t+o1k77fdQOAW8m1/P72q2eaSkpKJEmNGzeWJOXm5urSpUtKSEgwa9q1a6eWLVsqJydHkpSTk6NOnTqZgUmSEhMT5fF4dPDgQbPmyjmqaqrmKC8vV25urldNQECAEhISzBoAAHBrC/J1A1UqKys1YcIE9e7dWx07dpQkud1u2e12NWrUyKs2IiJCbrfbrLkyMFWNV419W43H49GFCxd09uxZVVRUVFuTn59fbb9lZWUqKyszX3s8nms8YwAAUJf4zZ2mlJQUHThwQCtWrPB1K5bMmTNHTqfT3KKjo33dEgAAuI78IjSNHTtW69ev15YtW9SiRQtzf2RkpMrLy1VcXOxVX1RUpMjISLPm69+mq3r9XTUOh0NhYWFq2rSpAgMDq62pmuPrpk2bppKSEnM7fvz4tZ84AACoM3wamgzD0NixY/X2229r8+bNat26tdd4XFycgoODlZ2dbe4rKChQYWGhXC6XJMnlcmn//v1e33LbtGmTHA6HYmNjzZor56iqqZrDbrcrLi7Oq6ayslLZ2dlmzdeFhITI4XB4bQAA4Obl02eaUlJSlJGRob/97W9q2LCh+QyS0+lUWFiYnE6nRo4cqdTUVDVu3FgOh0Pjxo2Ty+VSr169JEn9+vVTbGyshg0bprlz58rtdmv69OlKSUlRSEiIJGn06NFauHChJk+erBEjRmjz5s1atWqVMjP/79tVqampSk5OVvfu3dWzZ0/Nnz9fpaWlGj58+I2/MAAAwO/4NDQtXrxYkvSTn/zEa/+yZcv0xBNPSJLmzZungIAADRo0SGVlZUpMTNTrr79u1gYGBmr9+vUaM2aMXC6X6tevr+TkZM2ePdusad26tTIzMzVx4kQtWLBALVq00JtvvqnExESzZvDgwTp9+rTS0tLkdrvVtWtXZWVlXfVwOAAAuDX51TpNdRnrNF0frNNUM6zTBADW1Nl1mgAAAPwVoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYIFPQ9P27dv10EMPKSoqSjabTWvWrPEaNwxDaWlpat68ucLCwpSQkKDDhw971Zw5c0ZDhw6Vw+FQo0aNNHLkSJ0/f96r5uOPP9Y999yj0NBQRUdHa+7cuVf1snr1arVr106hoaHq1KmT3nnnnVo/XwAAUHf5NDSVlpaqS5cuWrRoUbXjc+fO1WuvvaYlS5Zo165dql+/vhITE3Xx4kWzZujQoTp48KA2bdqk9evXa/v27Ro1apQ57vF41K9fP7Vq1Uq5ubl66aWXNHPmTC1dutSs2bFjhx599FGNHDlSH374oQYMGKABAwbowIED1+/kAQBAnWIzDMPwdROSZLPZ9Pbbb2vAgAGS/nWXKSoqSs8884yeffZZSVJJSYkiIiKUnp6uIUOG6NChQ4qNjdWePXvUvXt3SVJWVpYeeOAB/fOf/1RUVJQWL16sX//613K73bLb7ZKkqVOnas2aNcrPz5ckDR48WKWlpVq/fr3ZT69evdS1a1ctWbLEUv8ej0dOp1MlJSVyOBy1dVlMMVMza33OuuDYi0k1fu+tes2k73fdAOBWci2/v/32maajR4/K7XYrISHB3Od0OhUfH6+cnBxJUk5Ojho1amQGJklKSEhQQECAdu3aZdbce++9ZmCSpMTERBUUFOjs2bNmzZXHqaqpOk51ysrK5PF4vDYAAHDz8tvQ5Ha7JUkRERFe+yMiIswxt9ut8PBwr/GgoCA1btzYq6a6Oa48xjfVVI1XZ86cOXI6neYWHR19racIAADqEL8NTf5u2rRpKikpMbfjx4/7uiUAAHAd+W1oioyMlCQVFRV57S8qKjLHIiMjderUKa/xy5cv68yZM1411c1x5TG+qaZqvDohISFyOBxeGwAAuHn5bWhq3bq1IiMjlZ2dbe7zeDzatWuXXC6XJMnlcqm4uFi5ublmzebNm1VZWan4+HizZvv27bp06ZJZs2nTJrVt21a33XabWXPlcapqqo4DAADg09B0/vx55eXlKS8vT9K/Hv7Oy8tTYWGhbDabJkyYoOeff15r167V/v379fjjjysqKsr8hl379u11//3366mnntLu3bv1wQcfaOzYsRoyZIiioqIkSY899pjsdrtGjhypgwcPauXKlVqwYIFSU1PNPsaPH6+srCy98sorys/P18yZM7V3716NHTv2Rl8SAADgp4J8efC9e/eqT58+5uuqIJOcnKz09HRNnjxZpaWlGjVqlIqLi/WjH/1IWVlZCg0NNd/z1ltvaezYserbt68CAgI0aNAgvfbaa+a40+nUu+++q5SUFMXFxalp06ZKS0vzWsvp7rvvVkZGhqZPn67nnntOd9xxh9asWaOOHTvegKsAAADqAr9Zp6muY52m64N1mmqGdZoAwJqbYp0mAAAAf0JoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDR9zaJFixQTE6PQ0FDFx8dr9+7dvm4JAAD4gSBfN+BPVq5cqdTUVC1ZskTx8fGaP3++EhMTVVBQoPDwcF+3BwCAYqZm+roFnzn2YpJPj8+dpiu8+uqreuqppzR8+HDFxsZqyZIlqlevnv74xz/6ujUAAOBjhKb/VV5ertzcXCUkJJj7AgIClJCQoJycHB92BgAA/AEfz/2vL774QhUVFYqIiPDaHxERofz8/Kvqy8rKVFZWZr4uKSmRJHk8nuvSX2XZV9dlXn/3fa7nrXrNpOv3/0MAvse/267PnIZhfGctoamG5syZo1mzZl21Pzo62gfd3Lyc833dQd3EdQNwM7qe/247d+6cnE7nt9YQmv5X06ZNFRgYqKKiIq/9RUVFioyMvKp+2rRpSk1NNV9XVlbqzJkzatKkiWw223Xv90bxeDyKjo7W8ePH5XA4fN1OncF1u3Zcs5rhutUM161mbsbrZhiGzp07p6ioqO+sJTT9L7vdrri4OGVnZ2vAgAGS/hWEsrOzNXbs2KvqQ0JCFBIS4rWvUaNGN6BT33A4HDfNPyA3Etft2nHNaobrVjNct5q52a7bd91hqkJoukJqaqqSk5PVvXt39ezZU/Pnz1dpaamGDx/u69YAAICPEZquMHjwYJ0+fVppaWlyu93q2rWrsrKyrno4HAAA3HoITV8zduzYaj+Ou1WFhIRoxowZV30UiW/Hdbt2XLOa4brVDNetZm7162YzrHzHDgAA4BbH4pYAAAAWEJoAAAAsIDQBAABYQGgCAACwgNCEam3fvl0PPfSQoqKiZLPZtGbNGl+35PfmzJmjHj16qGHDhgoPD9eAAQNUUFDg67b83uLFi9W5c2dzsTyXy6UNGzb4uq065cUXX5TNZtOECRN83Ypfmzlzpmw2m9fWrl07X7dVJ3z++ef6xS9+oSZNmigsLEydOnXS3r17fd3WDUdoQrVKS0vVpUsXLVq0yNet1Bnbtm1TSkqKdu7cqU2bNunSpUvq16+fSktLfd2aX2vRooVefPFF5ebmau/evbrvvvv08MMP6+DBg75urU7Ys2eP/vCHP6hz586+bqVO6NChg06ePGluf//7333dkt87e/asevfureDgYG3YsEH/+Mc/9Morr+i2227zdWs3HOs0oVr9+/dX//79fd1GnZKVleX1Oj09XeHh4crNzdW9997ro67830MPPeT1+j/+4z+0ePFi7dy5Ux06dPBRV3XD+fPnNXToUL3xxht6/vnnfd1OnRAUFFTt3xPFN/vd736n6OhoLVu2zNzXunVrH3bkO9xpAq6TkpISSVLjxo193EndUVFRoRUrVqi0tFQul8vX7fi9lJQUJSUlKSEhwdet1BmHDx9WVFSUbr/9dg0dOlSFhYW+bsnvrV27Vt27d9fPf/5zhYeH66677tIbb7zh67Z8gjtNwHVQWVmpCRMmqHfv3urYsaOv2/F7+/fvl8vl0sWLF9WgQQO9/fbbio2N9XVbfm3FihXat2+f9uzZ4+tW6oz4+Hilp6erbdu2OnnypGbNmqV77rlHBw4cUMOGDX3dnt/67LPPtHjxYqWmpuq5557Tnj179PTTT8tutys5OdnX7d1QhCbgOkhJSdGBAwd4XsKitm3bKi8vTyUlJfrzn/+s5ORkbdu2jeD0DY4fP67x48dr06ZNCg0N9XU7dcaVjxx07txZ8fHxatWqlVatWqWRI0f6sDP/VllZqe7du+uFF16QJN111106cOCAlixZcsuFJj6eA2rZ2LFjtX79em3ZskUtWrTwdTt1gt1uV5s2bRQXF6c5c+aoS5cuWrBgga/b8lu5ubk6deqUunXrpqCgIAUFBWnbtm167bXXFBQUpIqKCl+3WCc0atRId955p44cOeLrVvxa8+bNr/oPmPbt29+SH21ypwmoJYZhaNy4cXr77be1devWW/ZBydpQWVmpsrIyX7fht/r27av9+/d77Rs+fLjatWunKVOmKDAw0Eed1S3nz5/Xp59+qmHDhvm6Fb/Wu3fvq5ZP+eSTT9SqVSsfdeQ7hCZU6/z5817/9XX06FHl5eWpcePGatmypQ87818pKSnKyMjQ3/72NzVs2FBut1uS5HQ6FRYW5uPu/Ne0adPUv39/tWzZUufOnVNGRoa2bt2qjRs3+ro1v9WwYcOrnpWrX7++mjRpwjN03+LZZ5/VQw89pFatWunEiROaMWOGAgMD9eijj/q6Nb82ceJE3X333XrhhRf07//+79q9e7eWLl2qpUuX+rq1G88AqrFlyxZD0lVbcnKyr1vzW9VdL0nGsmXLfN2aXxsxYoTRqlUrw263G82aNTP69u1rvPvuu75uq8758Y9/bIwfP97Xbfi1wYMHG82bNzfsdrvxgx/8wBg8eLBx5MgRX7dVJ6xbt87o2LGjERISYrRr185YunSpr1vyCZthGIaP8hoAAECdwYPgAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgCwYOvWrbLZbCouLv5e8xw7dkw2m015eXnX/VgAahd/RgUAbqDo6GidPHlSTZs29XUrAK4RoQkAbpDy8nLZ7XZFRkb6uhUANcDHcwDqlKVLlyoqKkqVlZVe+x9++GGNGDFCkvS3v/1N3bp1U2hoqG6//XbNmjVLly9fNmttNpvefPNN/exnP1O9evV0xx13aO3atV7zvfPOO7rzzjsVFhamPn366NixY1f18pe//EUdOnRQSEiIYmJi9Morr3iNx8TE6Le//a0ef/xxORwOjRo1qtqP56wcC4Af8PUfvwOAa3HmzBnDbrcb7733nrnvyy+/NPdt377dcDgcRnp6uvHpp58a7777rhETE2PMnDnTrJdktGjRwsjIyDAOHz5sPP3000aDBg2ML7/80jAMwygsLDRCQkKM1NRUIz8/3/jTn/5kREREGJKMs2fPGoZhGHv37jUCAgKM2bNnGwUFBcayZcuMsLAwrz/Q3KpVK8PhcBgvv/yyceTIEePIkSPG0aNHDUnGhx9+aPlYAPwDoQlAnfPwww8bI0aMMF//4Q9/MKKiooyKigqjb9++xgsvvOBV/9///d9G8+bNzdeSjOnTp5uvz58/b0gyNmzYYBiGYUybNs2IjY31mmPKlCleQeaxxx4zfvrTn3rVTJo0yet9rVq1MgYMGOBV8/XQZOVYAPwDH88BqHOGDh2qv/zlLyorK5MkvfXWWxoyZIgCAgL00Ucfafbs2WrQoIG5PfXUUzp58qS++uorc47OnTubP9evX18Oh0OnTp2SJB06dEjx8fFex3S5XF6vDx06pN69e3vt6927tw4fPqyKigpzX/fu3b/1XKwcC4B/4EFwAHXOQw89JMMwlJmZqR49euj999/XvHnzJEnnz5/XrFmzNHDgwKveFxoaav4cHBzsNWaz2a56Tqo21K9fv9bnBOAbhCYAdU5oaKgGDhyot956S0eOHFHbtm3VrVs3SVK3bt1UUFCgNm3a1Hj+9u3bX/Vg+M6dO6+q+eCDD7z2ffDBB7rzzjsVGBhYq8cC4B/4eA5AnTR06FBlZmbqj3/8o4YOHWruT0tL03/9139p1qxZOnjwoA4dOqQVK1Zo+vTplucePXq0Dh8+rEmTJqmgoEAZGRlKT0/3qnnmmWeUnZ2t3/72t/rkk0+0fPlyLVy4UM8+++w1nYeVYwHwD4QmAHXSfffdp8aNG6ugoECPPfaYuT8xMVHr16/Xu+++qx49eqhXr16aN2+eWrVqZXnuli1b6i9/+YvWrFmjLl26aMmSJXrhhRe8arp166ZVq1ZpxYoV6tixo9LS0jR79mw98cQT13QeVo4FwD/YDMMwfN0EAACAv+NOEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAs+P/dDPqsieQZugAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%sqlplot bar --table taxi --column vendorid"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dd9005c9-8f88-4448-bc79-0916d012c42f",
+   "metadata": {},
+   "source": [
+    "### Pie"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "id": "8064ebec-e294-4019-a9c7-e1af48a1eb81",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<span style=\"None\">Removing NULLs, if there exists any from vendorid</span>"
+      ],
+      "text/plain": [
+       "Removing NULLs, if there exists any from vendorid"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<Axes: title={'center': 'taxi'}>"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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5Dlk+IcEpUSnIDMpE5mJwW/dWnXDJamXwO3Q79VlZD0cBTIEf8CPY1XHtKEoqCpAUW0RimqKUFxbrJs300XZo5DqTkWXhC7aAHRN6orMxEzeX4gMgaNAplBWX4bi2mIU1RShqLYIp2pOobi2GB6vB7WNtahurEZtYy1qGmtQ76uHN+CF1+/93k3/bIoNLpsLTrsTLpsLLnvwm9PmhMvuQlJUElLdqUhxp6C1uzVS3ana/051pyLBlSD0d4AoNDgKZGlef3AcbIoNLrsLDhtvHEzWxlEgIiINb4pCREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNARESa/w/5aR/aWTcIZQAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%sqlplot pie --table taxi --column vendorid"
+   ]
+  },
+  {
    "cell_type": "markdown",
    "id": "c057eda2-2f9c-4048-a071-ae8592e03cf5",
    "metadata": {},
@@ -1064,7 +1275,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": 40,
    "id": "755ca85e-5015-49bb-b52d-7fd14bb85d0e",
    "metadata": {
     "tags": []
@@ -1074,9 +1285,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CONTAINER ID   IMAGE                              COMMAND                  CREATED             STATUS             PORTS                              NAMES\n",
-      "393a1a19b4bb   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   15 minutes ago      Up 15 minutes      1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n",
-      "94fa1f440c4c   postgres                           \"docker-entrypoint.s…\"   About an hour ago   Up About an hour   0.0.0.0:5432->5432/tcp             postgres\n"
+      "CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                              NAMES\n",
+      "fabfc30490a1   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   7 minutes ago   Up 7 minutes   1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n"
      ]
     }
    ],
@@ -1087,7 +1297,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 57,
+   "execution_count": 41,
    "id": "66c440de-78ac-4fa2-a6e0-692588ca6be0",
    "metadata": {
     "tags": []
@@ -1108,7 +1318,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 58,
+   "execution_count": 42,
    "id": "6eeb8cb5-18ce-48e8-8609-53db1ad78026",
    "metadata": {
     "tags": []
@@ -1129,7 +1339,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 59,
+   "execution_count": 43,
    "id": "6fb190ad-cb88-4fed-a650-0e568bed3330",
    "metadata": {
     "tags": []
@@ -1139,8 +1349,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                    NAMES\n",
-      "94fa1f440c4c   postgres   \"docker-entrypoint.s…\"   About an hour ago   Up About an hour   0.0.0.0:5432->5432/tcp   postgres\n"
+      "CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n"
      ]
     }
    ],
@@ -1166,7 +1375,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.10.11"
+   "version": "3.10.12"
   },
   "myst": {
    "html_meta": {
diff --git a/src/sql/connection/__init__.py b/src/sql/connection/__init__.py
index 52decc9..213ae0f 100644
--- a/src/sql/connection/__init__.py
+++ b/src/sql/connection/__init__.py
@@ -5,6 +5,7 @@ from sql.connection.connection import (
     is_pep249_compliant,
     PLOOMBER_DOCS_LINK_STR,
     default_alias_for_engine,
+    ResultSetCollection,
 )
 
 
@@ -15,4 +16,5 @@ __all__ = [
     "is_pep249_compliant",
     "PLOOMBER_DOCS_LINK_STR",
     "default_alias_for_engine",
+    "ResultSetCollection",
 ]
diff --git a/src/sql/connection/connection.py b/src/sql/connection/connection.py
index 5c9229b..0e813ad 100644
--- a/src/sql/connection/connection.py
+++ b/src/sql/connection/connection.py
@@ -81,13 +81,35 @@ def extract_module_name_from_NoSuchModuleError(e):
     return str(e).split(":")[-1].split(".")[-1]
 
 
-"""
-When there is ModuleNotFoundError or NoSuchModuleError case
-Three types of suggestions will be shown when the missing module name is:
-1. Excepted in the pre-defined map, suggest the user to install the driver pkg
-2. Closely matched to the pre-defined map, suggest the user to type correct driver name
-3. Not found in the pre-defined map, suggest user to use valid driver pkg
-"""
+class ResultSetCollection:
+    def __init__(self) -> None:
+        self._result_sets = []
+
+    def append(self, result):
+        if result in self._result_sets:
+            self._result_sets.remove(result)
+
+        self._result_sets.append(result)
+
+    def is_last(self, result):
+        # if there are no results, return True to prevent triggering
+        # a query in the database
+        if not len(self._result_sets):
+            return True
+
+        return self._result_sets[-1] is result
+
+    def close_all(self):
+        for r in self._result_sets:
+            r.close()
+
+        self._result_sets = []
+
+    def __iter__(self):
+        return iter(self._result_sets)
+
+    def __len__(self):
+        return len(self._result_sets)
 
 
 def get_missing_package_suggestion_str(e):
@@ -355,7 +377,7 @@ class AbstractConnection(abc.ABC):
         ConnectionManager.current = self
         ConnectionManager.connections[alias] = self
 
-        self._result_sets = []
+        self._result_sets = ResultSetCollection()
 
     @abc.abstractproperty
     def dialect(self):
@@ -546,7 +568,9 @@ class SQLAlchemyConnection(AbstractConnection):
             engine, self._url
         )
 
-        self._dialect = self._get_database_information()["dialect"]
+        db_info = self._get_database_information()
+        self._dialect = db_info["dialect"]
+        self._driver = db_info["driver"]
 
         autocommit = True if config is None else config.autocommit
 
@@ -578,6 +602,10 @@ class SQLAlchemyConnection(AbstractConnection):
     def dialect(self):
         return self._dialect
 
+    @property
+    def driver(self):
+        return self._driver
+
     def _connection_execute(self, query, parameters=None):
         """Call the connection execute method
 
@@ -653,6 +681,11 @@ class SQLAlchemyConnection(AbstractConnection):
         with_ : list, default None
             List of CTEs to use in the query
         """
+        # mssql with pyodbc does not support multiple open result sets, so we need
+        # to close them all before issuing a new query
+        if self.dialect == "mssql" and self.driver == "pyodbc":
+            self._result_sets.close_all()
+
         if with_:
             query = self._resolve_cte(query, with_)
 
@@ -773,6 +806,7 @@ class DBAPIConnection(AbstractConnection):
         _is_duckdb_native = _check_if_duckdb_dbapi_connection(connection)
 
         self._dialect = "duckdb" if _is_duckdb_native else None
+        self._driver = None
 
         # TODO: implement the dialect blacklist and add unit tests
         self._requires_manual_commit = True if config is None else config.autocommit
@@ -791,6 +825,10 @@ class DBAPIConnection(AbstractConnection):
     def dialect(self):
         return self._dialect
 
+    @property
+    def driver(self):
+        return self._driver
+
     def raw_execute(self, query, parameters=None, with_=None):
         """Run the query without any preprocessing
 
diff --git a/src/sql/run/resultset.py b/src/sql/run/resultset.py
index 0b1c929..2d6bfcb 100644
--- a/src/sql/run/resultset.py
+++ b/src/sql/run/resultset.py
@@ -4,7 +4,6 @@ from functools import reduce
 from io import StringIO
 import html
 from collections.abc import Iterable
-from collections import defaultdict
 
 
 import prettytable
@@ -15,47 +14,14 @@ from sql.telemetry import telemetry
 from sql.run.table import CustomPrettyTable
 
 
-class ResultSetsManager:
-    def __init__(self) -> None:
-        self._results = defaultdict(list)
-
-    def append_to_key(self, key, result):
-        """
-        Append object to a given key, if it already exists, it doesn't add
-        a duplicate but moves it to the end
-        """
-        results_for_key = self._results[key]
-
-        if result in results_for_key:
-            results_for_key.remove(result)
-
-        results_for_key.append(result)
-
-    def is_last_for_key(self, key, result):
-        """
-        Check if the passed result is the last one for the given key,
-        returns True if there are no results for the key
-        """
-        results_for_key = self._results[key]
-
-        # if there are no results, return True to prevent triggering
-        # a query in the database
-        if not len(results_for_key):
-            return True
-
-        return results_for_key[-1] is result
-
-
 class ResultSet(ColumnGuesserMixin):
     """
     Results of a SQL query. Fetches rows lazily (only the necessary rows to show the
     preview based on the current configuration)
     """
 
-    # user to overcome drivers limitations, see @sqlaproxy for details
-    BY_CONNECTION = ResultSetsManager()
-
     def __init__(self, sqlaproxy, config, statement=None, conn=None):
+        self._closed = False
         self._config = config
         self._statement = statement
         self._sqlaproxy = sqlaproxy
@@ -85,25 +51,32 @@ class ResultSet(ColumnGuesserMixin):
 
         self._finished_init = True
 
-        # TODO: clean up, this is redundant
         if conn:
             conn._result_sets.append(self)
 
-        ResultSet.BY_CONNECTION.append_to_key(conn, self)
-
     @property
     def sqlaproxy(self):
+        conn = self._conn
+
+        # mssql with pyodbc does not support multiple open result sets, so we need
+        # to close them all. when running this, we might've already closed the results
+        # so we need to check for that and re-open the results if needed
+        if conn.dialect == "mssql" and conn.driver == "pyodbc" and self._closed:
+            self._conn._result_sets.close_all()
+            self._sqlaproxy = self._conn.raw_execute(self._statement)
+            self._sqlaproxy.fetchmany(size=len(self._results))
+            self._conn._result_sets.append(self)
+
         # there is a problem when using duckdb + sqlalchemy: duckdb-engine doesn't
         # create separate cursors, so whenever we have >1 ResultSet, the old ones
         # become outdated and fetching their results will return the results from
         # the last ResultSet. To fix this, we have to re-issue the query
-        is_last_result = ResultSet.BY_CONNECTION.is_last_for_key(self._conn, self)
+        is_last_result = self._conn._result_sets.is_last(self)
+
         is_duckdb_sqlalchemy = (
             self._dialect == "duckdb" and not self._conn.is_dbapi_connection
         )
 
-        # TODO: re-open it if closed
-
         if (
             # skip this if we're initializing the object (we're running __init__)
             hasattr(self, "_finished_init")
@@ -114,7 +87,8 @@ class ResultSet(ColumnGuesserMixin):
             self._sqlaproxy = self._conn.raw_execute(self._statement)
             self._sqlaproxy.fetchmany(size=len(self._results))
 
-            ResultSet.BY_CONNECTION.append_to_key(self._conn, self)
+            # ensure we make his result set the last one
+            self._conn._result_sets.append(self)
 
         return self._sqlaproxy
 
@@ -443,6 +417,10 @@ class ResultSet(ColumnGuesserMixin):
 
         return pretty
 
+    def close(self):
+        self._sqlaproxy.close()
+        self._closed = True
+
 
 def unduplicate_field_names(field_names):
     """Append a number to duplicate field names to make them unique."""


Test patch:
diff --git a/src/tests/integration/test_generic_db_operations.py b/src/tests/integration/test_generic_db_operations.py
index 49d982e..e72683b 100644
--- a/src/tests/integration/test_generic_db_operations.py
+++ b/src/tests/integration/test_generic_db_operations.py
@@ -361,6 +361,7 @@ BOX_PLOT_FAIL_REASON = (
         "ip_with_postgreSQL",
         "ip_with_duckDB",
         "ip_with_redshift",
+        "ip_with_MSSQL",
         pytest.param(
             "ip_with_duckDB_native",
             marks=pytest.mark.xfail(reason="Custom driver not supported"),
@@ -396,6 +397,60 @@ def test_sqlplot_boxplot(ip_with_dynamic_db, cell, request, test_table_name_dict
     assert type(out.result).__name__ in {"Axes", "AxesSubplot"}
 
 
+@pytest.mark.parametrize(
+    "ip_with_dynamic_db",
+    [
+        "ip_with_postgreSQL",
+        "ip_with_duckDB",
+        "ip_with_redshift",
+        "ip_with_MSSQL",
+    ],
+)
+def test_sqlplot_bar(ip_with_dynamic_db, request, test_table_name_dict):
+    plt.cla()
+
+    ip_with_dynamic_db = request.getfixturevalue(ip_with_dynamic_db)
+    ip_with_dynamic_db.run_cell(
+        f"%sql --save plot_something_subset --no-execute\
+          SELECT * from {test_table_name_dict['plot_something']} LIMIT 3"
+    )
+
+    cell = (
+        "%sqlplot bar --with plot_something_subset "
+        "--table plot_something_subset --column x"
+    )
+    out = ip_with_dynamic_db.run_cell(cell)
+
+    assert type(out.result).__name__ in {"Axes", "AxesSubplot"}
+
+
+@pytest.mark.parametrize(
+    "ip_with_dynamic_db",
+    [
+        "ip_with_postgreSQL",
+        "ip_with_duckDB",
+        "ip_with_redshift",
+        "ip_with_MSSQL",
+    ],
+)
+def test_sqlplot_pie(ip_with_dynamic_db, request, test_table_name_dict):
+    plt.cla()
+
+    ip_with_dynamic_db = request.getfixturevalue(ip_with_dynamic_db)
+    ip_with_dynamic_db.run_cell(
+        f"%sql --save plot_something_subset --no-execute\
+          SELECT * from {test_table_name_dict['plot_something']} LIMIT 3"
+    )
+
+    cell = (
+        "%sqlplot pie --with plot_something_subset "
+        "--table plot_something_subset --column x"
+    )
+    out = ip_with_dynamic_db.run_cell(cell)
+
+    assert type(out.result).__name__ in {"Axes", "AxesSubplot"}
+
+
 @pytest.mark.parametrize(
     "ip_with_dynamic_db",
     [
@@ -855,12 +910,7 @@ DROP TABLE my_numbers
         "ip_with_duckDB_native",
         "ip_with_duckDB",
         "ip_with_Snowflake",
-        pytest.param(
-            "ip_with_MSSQL",
-            marks=pytest.mark.xfail(
-                reason="We need to close existing result sets for this to work"
-            ),
-        ),
+        "ip_with_MSSQL",
         "ip_with_oracle",
     ],
 )
@@ -965,19 +1015,11 @@ CREATE_GLOBAL_TEMPORARY_TABLE = (
                 reason="We're executing operations in different cursors"
             ),
         ),
-        pytest.param(
-            "ip_with_MSSQL",
-            CREATE_TABLE,
-            marks=pytest.mark.xfail(
-                reason="We need to close all existing result sets for this to work"
-            ),
-        ),
+        ("ip_with_MSSQL", CREATE_TABLE),
         pytest.param(
             "ip_with_MSSQL",
             CREATE_TEMP_TABLE,
-            marks=pytest.mark.xfail(
-                reason="We need to close all existing result sets for this to work"
-            ),
+            marks=pytest.mark.xfail(reason="We need to fix the create table statement"),
         ),
         pytest.param(
             "ip_with_oracle",
@@ -1038,13 +1080,7 @@ SELECT * FROM {__TABLE_NAME__};
                 reason="We're executing operations in different cursors"
             ),
         ),
-        pytest.param(
-            "ip_with_MSSQL",
-            CREATE_TABLE,
-            marks=pytest.mark.xfail(
-                reason="We need to close all existing result sets for this to work"
-            ),
-        ),
+        ("ip_with_MSSQL", CREATE_TABLE),
         pytest.param(
             "ip_with_MSSQL",
             CREATE_TEMP_TABLE,
diff --git a/src/tests/test_connection.py b/src/tests/test_connection.py
index 9f1997e..6473df5 100644
--- a/src/tests/test_connection.py
+++ b/src/tests/test_connection.py
@@ -20,6 +20,7 @@ from sql.connection import (
     ConnectionManager,
     is_pep249_compliant,
     default_alias_for_engine,
+    ResultSetCollection,
 )
 
 
@@ -790,3 +791,40 @@ AS percentiles
     transpiled = conn._transpile_query(query_input)
 
     assert transpiled == query_input
+
+
+def test_result_set_collection_append():
+    collection = ResultSetCollection()
+    collection.append(1)
+    collection.append(2)
+
+    assert collection._result_sets == [1, 2]
+
+
+def test_result_set_collection_iterate():
+    collection = ResultSetCollection()
+    collection.append(1)
+    collection.append(2)
+
+    assert list(collection) == [1, 2]
+
+
+def test_result_set_collection_is_last():
+    collection = ResultSetCollection()
+    first, second = object(), object()
+    collection.append(first)
+
+    assert len(collection) == 1
+    assert collection.is_last(first)
+
+    collection.append(second)
+
+    assert len(collection) == 2
+    assert not collection.is_last(first)
+    assert collection.is_last(second)
+
+    collection.append(first)
+
+    assert len(collection) == 2
+    assert collection.is_last(first)
+    assert not collection.is_last(second)
diff --git a/src/tests/test_resultset.py b/src/tests/test_resultset.py
index ad8cc54..67d895d 100644
--- a/src/tests/test_resultset.py
+++ b/src/tests/test_resultset.py
@@ -11,7 +11,7 @@ import polars as pl
 import sqlalchemy
 
 from sql.connection import DBAPIConnection, SQLAlchemyConnection
-from sql.run.resultset import ResultSet, ResultSetsManager
+from sql.run.resultset import ResultSet
 from sql.connection.connection import IS_SQLALCHEMY_ONE
 
 
@@ -28,15 +28,17 @@ def result():
     df = pd.DataFrame({"x": range(3)})  # noqa
     engine = sqlalchemy.create_engine("duckdb://")
 
-    conn = engine.connect()
-    result = conn.execute(sqlalchemy.text("select * from df"))
-    yield result
+    conn = SQLAlchemyConnection(engine)
+    result = conn.raw_execute("select * from df")
+
+    yield result, conn
     conn.close()
 
 
 @pytest.fixture
 def result_set(result, config):
-    return ResultSet(result, config, statement=None, conn=Mock())
+    result_set, conn = result
+    return ResultSet(result_set, config, statement="select * from df", conn=conn)
 
 
 def test_resultset_getitem(result_set):
@@ -56,11 +58,17 @@ def test_resultset_dicts(result_set):
     assert list(result_set.dicts()) == [{"x": 0}, {"x": 1}, {"x": 2}]
 
 
-def test_resultset_dataframe(result_set, monkeypatch):
+def test_resultset_dataframe(result_set, config):
+    # since this will use the native method, the issue will be re-executed
+    # so we need to create the df here so duckdb can find it
+    df = pd.DataFrame({"x": range(3)})  # noqa
     assert result_set.DataFrame().equals(pd.DataFrame({"x": range(3)}))
 
 
-def test_resultset_polars_dataframe(result_set, monkeypatch):
+def test_resultset_polars_dataframe(result_set):
+    # since this will use the native method, the issue will be re-executed
+    # so we need to create the df here so duckdb can find it
+    df = pd.DataFrame({"x": range(3)})  # noqa
     assert result_set.PolarsDataFrame().frame_equal(pl.DataFrame({"x": range(3)}))
 
 
@@ -108,7 +116,8 @@ def test_invalid_operation_error(result_set, fname, parameters):
 
 def test_resultset_config_autolimit_dict(result, config):
     config.autolimit = 1
-    resultset = ResultSet(result, config, statement=None, conn=Mock())
+    resultset = ResultSet(result[0], config, statement=None, conn=result[1])
+
     assert resultset.dict() == {"x": (0,)}
 
 
@@ -589,38 +598,3 @@ def test_doesnt_refresh_sqlaproxy_if_different_connection():
     list(first_set)
 
     assert id(first_set._sqlaproxy) == original_id
-
-
-def test_manager_append():
-    m = ResultSetsManager()
-    first = object()
-    second = object()
-
-    m.append_to_key("first", first)
-    assert m._results == {"first": [first]}
-
-    m.append_to_key("second", second)
-    assert m._results == {"first": [first], "second": [second]}
-
-    final = object()
-    m.append_to_key("first", final)
-    assert m._results == {"first": [first, final], "second": [second]}
-
-    # if it already exists, appending should move it to the end
-    m.append_to_key("first", first)
-    assert m._results == {"first": [final, first], "second": [second]}
-
-
-def test_manager_is_last_for_key():
-    m = ResultSetsManager()
-    first = object()
-    second = object()
-
-    m.append_to_key("first", first)
-
-    assert m.is_last_for_key("unknown-key", object()) is True
-    assert m.is_last_for_key("first", first) is True
-
-    m.append_to_key("first", second)
-    assert m.is_last_for_key("first", first) is False
-    assert m.is_last_for_key("first", second) is True