dialect = context.dialect
self.case_sensitive = dialect.case_sensitive
self.matched_on_name = False
+ self._orig_processors = None
if context.result_column_struct:
result_columns, cols_are_ordered, textual_ordered = \
def _init_metadata(self):
super(BufferedColumnResultProxy, self)._init_metadata()
+
metadata = self._metadata
- # orig_processors will be used to preprocess each row when they are
- # constructed.
- metadata._orig_processors = metadata._processors
- # replace the all type processors by None processors.
- metadata._processors = [None for _ in range(len(metadata.keys))]
- keymap = {}
- for k, (func, obj, index) in metadata._keymap.items():
- keymap[k] = (None, obj, index)
- self._metadata._keymap = keymap
+
+ # don't double-replace the processors, in the case
+ # of a cached ResultMetaData
+ if metadata._orig_processors is None:
+ # orig_processors will be used to preprocess each row when
+ # they are constructed.
+ metadata._orig_processors = metadata._processors
+ # replace the all type processors by None processors.
+ metadata._processors = [None for _ in range(len(metadata.keys))]
+ keymap = {}
+ for k, (func, obj, index) in metadata._keymap.items():
+ keymap[k] = (None, obj, index)
+ metadata._keymap = keymap
def fetchall(self):
# can't call cursor.fetchall(), since rows must be
from sqlalchemy import (
exc, sql, func, select, String, Integer, MetaData, ForeignKey,
VARCHAR, INT, CHAR, text, type_coerce, literal_column,
- TypeDecorator, table, column)
+ TypeDecorator, table, column, literal)
from sqlalchemy.engine import result as _result
from sqlalchemy.testing.schema import Table, Column
import operator
r.fetchall
)
- def test_plain(self):
+ def test_basic_plain(self):
self._test_proxy(_result.ResultProxy)
- def test_buffered_row_result_proxy(self):
+ def test_basic_buffered_row_result_proxy(self):
self._test_proxy(_result.BufferedRowResultProxy)
- def test_fully_buffered_result_proxy(self):
+ def test_basic_fully_buffered_result_proxy(self):
self._test_proxy(_result.FullyBufferedResultProxy)
- def test_buffered_column_result_proxy(self):
+ def test_basic_buffered_column_result_proxy(self):
self._test_proxy(_result.BufferedColumnResultProxy)
+ def test_resultprocessor_plain(self):
+ self._test_result_processor(_result.ResultProxy, False)
+
+ def test_resultprocessor_plain_cached(self):
+ self._test_result_processor(_result.ResultProxy, True)
+
+ def test_resultprocessor_buffered_column(self):
+ self._test_result_processor(_result.BufferedColumnResultProxy, False)
+
+ def test_resultprocessor_buffered_column_cached(self):
+ self._test_result_processor(_result.BufferedColumnResultProxy, True)
+
+ def test_resultprocessor_buffered_row(self):
+ self._test_result_processor(_result.BufferedRowResultProxy, False)
+
+ def test_resultprocessor_buffered_row_cached(self):
+ self._test_result_processor(_result.BufferedRowResultProxy, True)
+
+ def test_resultprocessor_fully_buffered(self):
+ self._test_result_processor(_result.FullyBufferedResultProxy, False)
+
+ def test_resultprocessor_fully_buffered_cached(self):
+ self._test_result_processor(_result.FullyBufferedResultProxy, True)
+
+ def _test_result_processor(self, cls, use_cache):
+ class MyType(TypeDecorator):
+ impl = String()
+
+ def process_result_value(self, value, dialect):
+ return "HI " + value
+
+ with self._proxy_fixture(cls):
+ with self.engine.connect() as conn:
+ if use_cache:
+ cache = {}
+ conn = conn.execution_options(compiled_cache=cache)
+
+ stmt = select([literal("THERE", type_=MyType())])
+ for i in range(2):
+ r = conn.execute(stmt)
+ eq_(r.scalar(), "HI THERE")
+
def test_buffered_row_growth(self):
with self._proxy_fixture(_result.BufferedRowResultProxy):
with self.engine.connect() as conn: