From c6c114b18a95503fcced9f57323d9a92354611f6 Mon Sep 17 00:00:00 2001
From: "David J. Malan" <malan@harvard.edu>
Date: Fri, 7 Jul 2017 20:19:44 -0400
Subject: [PATCH 1/4] removed requirement of space after SELECT et al.

---
 src/cs50/sql.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/cs50/sql.py b/src/cs50/sql.py
index 4cfbd78..03c6188 100644
--- a/src/cs50/sql.py
+++ b/src/cs50/sql.py
@@ -122,12 +122,12 @@ def process(value):
             self.logger.debug(statement)
 
             # if SELECT (or INSERT with RETURNING), return result set as list of dict objects
-            if re.search(r"^\s*SELECT\s+", statement, re.I):
+            if re.search(r"^\s*SELECT", statement, re.I):
                 rows = result.fetchall()
                 return [dict(row) for row in rows]
 
             # if INSERT, return primary key value for a newly inserted row
-            elif re.search(r"^\s*INSERT\s+", statement, re.I):
+            elif re.search(r"^\s*INSERT", statement, re.I):
                 if self.engine.url.get_backend_name() in ["postgres", "postgresql"]:
                     result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()"))
                     return result.first()[0]
@@ -135,7 +135,7 @@ def process(value):
                     return result.lastrowid
 
             # if DELETE or UPDATE, return number of rows matched
-            elif re.search(r"^\s*(?:DELETE|UPDATE)\s+", statement, re.I):
+            elif re.search(r"^\s*(?:DELETE|UPDATE)", statement, re.I):
                 return result.rowcount
 
             # if some other statement, return True unless exception

From dc148b4ecf59e6aa78dcd162a1cccd9ae5b1cf57 Mon Sep 17 00:00:00 2001
From: "David J. Malan" <malan@harvard.edu>
Date: Fri, 7 Jul 2017 21:33:21 -0400
Subject: [PATCH 2/4] coercing decimal.Decimal objects to float objects for
 PostgreSQL

---
 src/cs50/sql.py | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/cs50/sql.py b/src/cs50/sql.py
index 03c6188..9966bbf 100644
--- a/src/cs50/sql.py
+++ b/src/cs50/sql.py
@@ -1,4 +1,5 @@
 import datetime
+import decimal
 import importlib
 import logging
 import re
@@ -31,7 +32,6 @@ def execute(self, text, **params):
         """
         Execute a SQL statement.
         """
-
         class UserDefinedType(sqlalchemy.TypeDecorator):
             """
             Add support for expandable values, a la https://bitbucket.org/zzzeek/sqlalchemy/issues/3953/expanding-parameter.
@@ -123,8 +123,14 @@ def process(value):
 
             # if SELECT (or INSERT with RETURNING), return result set as list of dict objects
             if re.search(r"^\s*SELECT", statement, re.I):
-                rows = result.fetchall()
-                return [dict(row) for row in rows]
+
+                # coerce any decimal.Decimal objects to float objects
+                rows = [dict(row) for row in result.fetchall()]
+                for row in rows:
+                    for column in row:
+                        if isinstance(row[column], decimal.Decimal):
+                            row[column] = float(row[column])
+                return rows
 
             # if INSERT, return primary key value for a newly inserted row
             elif re.search(r"^\s*INSERT", statement, re.I):

From 3d3fc0f8658197d5fc3cdb1589cfc21bfe40ee7d Mon Sep 17 00:00:00 2001
From: "David J. Malan" <malan@harvard.edu>
Date: Fri, 7 Jul 2017 21:40:18 -0400
Subject: [PATCH 3/4] added citation

---
 src/cs50/sql.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/cs50/sql.py b/src/cs50/sql.py
index 9966bbf..4b54d97 100644
--- a/src/cs50/sql.py
+++ b/src/cs50/sql.py
@@ -125,6 +125,7 @@ def process(value):
             if re.search(r"^\s*SELECT", statement, re.I):
 
                 # coerce any decimal.Decimal objects to float objects
+                # https://groups.google.com/d/msg/sqlalchemy/0qXMYJvq8SA/oqtvMD9Uw-kJ
                 rows = [dict(row) for row in result.fetchall()]
                 for row in rows:
                     for column in row:

From d9cad38337d6e85247484a42399e1785e4e88bee Mon Sep 17 00:00:00 2001
From: "David J. Malan" <malan@harvard.edu>
Date: Sat, 8 Jul 2017 00:29:01 -0400
Subject: [PATCH 4/4] incremented version

---
 setup.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/setup.py b/setup.py
index 8e6ee91..b4d078d 100644
--- a/setup.py
+++ b/setup.py
@@ -16,5 +16,5 @@
     package_dir={"": "src"},
     packages=["cs50"],
     url="https://github.com/cs50/python-cs50",
-    version="2.1.0"
+    version="2.1.1"
 )