{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.dUkKMKZ8/b1/sqlalchemy_2.0.40+ds1-1_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.dUkKMKZ8/b2/sqlalchemy_2.0.40+ds1-1_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,5 +1,5 @@\n \n- cbe318085689c47c8c6d5dead675c097 3987816 doc optional python-sqlalchemy-doc_2.0.40+ds1-1_all.deb\n+ eab2a386ef64f958ed08b801690f6f11 3987572 doc optional python-sqlalchemy-doc_2.0.40+ds1-1_all.deb\n 856814a65ad466f43501f4a07be4367b 919236 debug optional python3-sqlalchemy-ext-dbgsym_2.0.40+ds1-1_amd64.deb\n 1be620144e503b8dbd1a14e2d7a27a64 153012 python optional python3-sqlalchemy-ext_2.0.40+ds1-1_amd64.deb\n 8aaa3be24daec5bb97aecb6139c4ede1 1210292 python optional python3-sqlalchemy_2.0.40+ds1-1_all.deb\n"}, {"source1": "python-sqlalchemy-doc_2.0.40+ds1-1_all.deb", "source2": "python-sqlalchemy-doc_2.0.40+ds1-1_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2025-02-06 11:19:07.000000 debian-binary\n--rw-r--r-- 0 0 0 13680 2025-02-06 11:19:07.000000 control.tar.xz\n--rw-r--r-- 0 0 0 3973944 2025-02-06 11:19:07.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 13676 2025-02-06 11:19:07.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 3973704 2025-02-06 11:19:07.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_14.html", "source2": "./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_14.html", "unified_diff": "@@ -9314,15 +9314,22 @@\n
See also
\n \nReferences: #4710
\n \n \n-[engine] [change] [performance] [py3k] \u00b6
Disabled the \u201cunicode returns\u201d check that runs on dialect startup when\n+
[engine] [performance] \u00b6
The pool \u201cpre-ping\u201d feature has been refined to not invoke for a DBAPI\n+connection that was just opened in the same checkout operation. pre ping\n+only applies to a DBAPI connection that\u2019s been checked into the pool\n+and is being checked out again.
\n+References: #4524
\n+\n+[engine] [performance] [change] [py3k] \u00b6
Disabled the \u201cunicode returns\u201d check that runs on dialect startup when\n running under Python 3, which for many years has occurred in order to test\n the current DBAPI\u2019s behavior for whether or not it returns Python Unicode\n or Py2K strings for the VARCHAR and NVARCHAR datatypes. The check still\n occurs by default under Python 2, however the mechanism to test the\n behavior will be removed in SQLAlchemy 2.0 when Python 2 support is also\n removed.
\nThis logic was very effective when it was needed, however now that Python 3\n@@ -9333,21 +9340,14 @@\n dialect flags by setting the dialect level flag returns_unicode_strings\n to one of String.RETURNS_CONDITIONAL or\n String.RETURNS_BYTES, both of which will enable Unicode conversion\n even under Python 3.
References: #5315
\n \n[engine] [performance] \u00b6
The pool \u201cpre-ping\u201d feature has been refined to not invoke for a DBAPI\n-connection that was just opened in the same checkout operation. pre ping\n-only applies to a DBAPI connection that\u2019s been checked into the pool\n-and is being checked out again.
\n-References: #4524
\n-\n-[engine] [bug] \u00b6
Revised the Connection.execution_options.schema_translate_map\n feature such that the processing of the SQL statement to receive a specific\n schema name occurs within the execution phase of the statement, rather than\n at the compile phase.   This is to support the statement being efficiently\n cached.   Previously, the current schema being rendered into the statement\n for a particular run would be considered as part of the cache key itself,\n meaning that for a run against hundreds of schemas, there would be hundreds\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -6406,15 +6406,21 @@\n returned by the ResultProxy is now the LegacyRow subclass, which maintains\n mapping/tuple hybrid behavior, however the base _\bR_\bo_\bw class now behaves more\n fully like a named tuple.\n See also\n _\bR_\bo_\bw_\bP_\br_\bo_\bx_\by_\b _\bi_\bs_\b _\bn_\bo_\b _\bl_\bo_\bn_\bg_\be_\br_\b _\ba_\b _\b\u201c_\bp_\br_\bo_\bx_\by_\b\u201d_\b;_\b _\bi_\bs_\b _\bn_\bo_\bw_\b _\bc_\ba_\bl_\bl_\be_\bd_\b _\bR_\bo_\bw_\b _\ba_\bn_\bd_\b _\bb_\be_\bh_\ba_\bv_\be_\bs_\b _\bl_\bi_\bk_\be_\b _\ba_\bn_\b _\be_\bn_\bh_\ba_\bn_\bc_\be_\bd\n _\bn_\ba_\bm_\be_\bd_\b _\bt_\bu_\bp_\bl_\be\n References: _\b#_\b4_\b7_\b1_\b0\n-[\b[e\ben\bng\bgi\bin\bne\be]\b] [\b[c\bch\bha\ban\bng\bge\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] [\b[p\bpy\by3\b3k\bk]\b] _\b\u00b6\n+[\b[e\ben\bng\bgi\bin\bne\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] _\b\u00b6\n+The pool \u201cpre-ping\u201d feature has been refined to not invoke for a DBAPI\n+connection that was just opened in the same checkout operation. pre ping only\n+applies to a DBAPI connection that\u2019s been checked into the pool and is being\n+checked out again.\n+References: _\b#_\b4_\b5_\b2_\b4\n+[\b[e\ben\bng\bgi\bin\bne\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] [\b[c\bch\bha\ban\bng\bge\be]\b] [\b[p\bpy\by3\b3k\bk]\b] _\b\u00b6\n Disabled the \u201cunicode returns\u201d check that runs on dialect startup when running\n under Python 3, which for many years has occurred in order to test the current\n DBAPI\u2019s behavior for whether or not it returns Python Unicode or Py2K strings\n for the VARCHAR and NVARCHAR datatypes. The check still occurs by default under\n Python 2, however the mechanism to test the behavior will be removed in\n SQLAlchemy 2.0 when Python 2 support is also removed.\n This logic was very effective when it was needed, however now that Python 3 is\n@@ -6422,20 +6428,14 @@\n datatypes. In the unlikely case that a third party DBAPI does not support this,\n the conversion logic within _\bS_\bt_\br_\bi_\bn_\bg is still available and the third party\n dialect may specify this in its upfront dialect flags by setting the dialect\n level flag returns_unicode_strings to one of String.RETURNS_CONDITIONAL or\n String.RETURNS_BYTES, both of which will enable Unicode conversion even under\n Python 3.\n References: _\b#_\b5_\b3_\b1_\b5\n-[\b[e\ben\bng\bgi\bin\bne\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] _\b\u00b6\n-The pool \u201cpre-ping\u201d feature has been refined to not invoke for a DBAPI\n-connection that was just opened in the same checkout operation. pre ping only\n-applies to a DBAPI connection that\u2019s been checked into the pool and is being\n-checked out again.\n-References: _\b#_\b4_\b5_\b2_\b4\n [\b[e\ben\bng\bgi\bin\bne\be]\b] [\b[b\bbu\bug\bg]\b] _\b\u00b6\n Revised the _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bo_\bn_\b._\be_\bx_\be_\bc_\bu_\bt_\bi_\bo_\bn_\b__\bo_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bs_\bc_\bh_\be_\bm_\ba_\b__\bt_\br_\ba_\bn_\bs_\bl_\ba_\bt_\be_\b__\bm_\ba_\bp feature such that\n the processing of the SQL statement to receive a specific schema name occurs\n within the execution phase of the statement, rather than at the compile phase.\n This is to support the statement being efficiently cached. Previously, the\n current schema being rendered into the statement for a particular run would be\n considered as part of the cache key itself, meaning that for a run against\n"}]}, {"source1": "./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_20.html", "source2": "./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_20.html", "unified_diff": "@@ -8985,45 +8985,45 @@\n 
[sqlite] [usecase] \u00b6
Added RETURNING support for the SQLite dialect. SQLite supports RETURNING\n since version 3.35.
\nReferences: #6195
\n \n[sqlite] [usecase] [performance] \u00b6
SQLite datetime, date, and time datatypes now use Python standard lib\n-fromisoformat() methods in order to parse incoming datetime, date, and\n-time string values. This improves performance vs. the previous regular\n-expression-based approach, and also automatically accommodates for datetime\n-and time formats that contain either a six-digit \u201cmicroseconds\u201d format or a\n-three-digit \u201cmilliseconds\u201d format.
References: #7029
\n-\n-[sqlite] [usecase] \u00b6
The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements\n+
[sqlite] [usecase] \u00b6
The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements\n that may refer to additional tables within the WHERE criteria of the\n statement without the need to use subqueries. This syntax is invoked\n automatically when using the Update construct when more than\n one table or other entity or selectable is used.
References: #7185
\n \n[sqlite] [performance] [bug] \u00b6
The SQLite dialect now defaults to QueuePool when a file\n+
[sqlite] [performance] [bug] \u00b6
The SQLite dialect now defaults to QueuePool when a file\n based database is used. This is set along with setting the\n check_same_thread parameter to False. It has been observed that the\n previous approach of defaulting to NullPool, which does not\n hold onto database connections after they are released, did in fact have a\n measurable negative performance impact. As always, the pool class is\n customizable via the create_engine.poolclass parameter.
See also
\n \nReferences: #7490
\n \n[sqlite] [performance] [usecase] \u00b6
SQLite datetime, date, and time datatypes now use Python standard lib\n+fromisoformat() methods in order to parse incoming datetime, date, and\n+time string values. This improves performance vs. the previous regular\n+expression-based approach, and also automatically accommodates for datetime\n+and time formats that contain either a six-digit \u201cmicroseconds\u201d format or a\n+three-digit \u201cmilliseconds\u201d format.
References: #7029
\n+\n+[sqlite] [bug] \u00b6
Removed the warning that emits from the Numeric type about\n DBAPIs not supporting Decimal values natively. This warning was oriented\n towards SQLite, which does not have any real way without additional\n extensions or workarounds of handling precision numeric values more than 15\n significant digits as it only uses floating point math to represent\n numbers. As this is a known and documented limitation in SQLite itself, and\n not a quirk of the pysqlite driver, there\u2019s no need for SQLAlchemy to warn\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -6179,22 +6179,14 @@\n       See also\n       _\bR_\be_\bf_\bl_\be_\bc_\bt_\bi_\bn_\bg_\b _\bi_\bn_\bt_\be_\br_\bn_\ba_\bl_\b _\bs_\bc_\bh_\be_\bm_\ba_\b _\bt_\ba_\bb_\bl_\be_\bs\n       References: _\b#_\b8_\b2_\b3_\b4\n [\b[s\bsq\bql\bli\bit\bte\be]\b] [\b[u\bus\bse\bec\bca\bas\bse\be]\b] _\b\u00b6\n Added RETURNING support for the SQLite dialect. SQLite supports RETURNING since\n version 3.35.\n References: _\b#_\b6_\b1_\b9_\b5\n-[\b[s\bsq\bql\bli\bit\bte\be]\b] [\b[u\bus\bse\bec\bca\bas\bse\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] _\b\u00b6\n-SQLite datetime, date, and time datatypes now use Python standard lib\n-fromisoformat() methods in order to parse incoming datetime, date, and time\n-string values. This improves performance vs. the previous regular expression-\n-based approach, and also automatically accommodates for datetime and time\n-formats that contain either a six-digit \u201cmicroseconds\u201d format or a three-digit\n-\u201cmilliseconds\u201d format.\n-References: _\b#_\b7_\b0_\b2_\b9\n [\b[s\bsq\bql\bli\bit\bte\be]\b] [\b[u\bus\bse\bec\bca\bas\bse\be]\b] _\b\u00b6\n The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements that\n may refer to additional tables within the WHERE criteria of the statement\n without the need to use subqueries. This syntax is invoked automatically when\n using the _\bU_\bp_\bd_\ba_\bt_\be construct when more than one table or other entity or\n selectable is used.\n References: _\b#_\b7_\b1_\b8_\b5\n@@ -6204,14 +6196,22 @@\n It has been observed that the previous approach of defaulting to _\bN_\bu_\bl_\bl_\bP_\bo_\bo_\bl,\n which does not hold onto database connections after they are released, did in\n fact have a measurable negative performance impact. As always, the pool class\n is customizable via the _\bc_\br_\be_\ba_\bt_\be_\b__\be_\bn_\bg_\bi_\bn_\be_\b._\bp_\bo_\bo_\bl_\bc_\bl_\ba_\bs_\bs parameter.\n See also\n _\bT_\bh_\be_\b _\bS_\bQ_\bL_\bi_\bt_\be_\b _\bd_\bi_\ba_\bl_\be_\bc_\bt_\b _\bu_\bs_\be_\bs_\b _\bQ_\bu_\be_\bu_\be_\bP_\bo_\bo_\bl_\b _\bf_\bo_\br_\b _\bf_\bi_\bl_\be_\b-_\bb_\ba_\bs_\be_\bd_\b _\bd_\ba_\bt_\ba_\bb_\ba_\bs_\be_\bs\n References: _\b#_\b7_\b4_\b9_\b0\n+[\b[s\bsq\bql\bli\bit\bte\be]\b] [\b[p\bpe\ber\brf\bfo\bor\brm\bma\ban\bnc\bce\be]\b] [\b[u\bus\bse\bec\bca\bas\bse\be]\b] _\b\u00b6\n+SQLite datetime, date, and time datatypes now use Python standard lib\n+fromisoformat() methods in order to parse incoming datetime, date, and time\n+string values. This improves performance vs. the previous regular expression-\n+based approach, and also automatically accommodates for datetime and time\n+formats that contain either a six-digit \u201cmicroseconds\u201d format or a three-digit\n+\u201cmilliseconds\u201d format.\n+References: _\b#_\b7_\b0_\b2_\b9\n [\b[s\bsq\bql\bli\bit\bte\be]\b] [\b[b\bbu\bug\bg]\b] _\b\u00b6\n Removed the warning that emits from the _\bN_\bu_\bm_\be_\br_\bi_\bc type about DBAPIs not\n supporting Decimal values natively. This warning was oriented towards SQLite,\n which does not have any real way without additional extensions or workarounds\n of handling precision numeric values more than 15 significant digits as it only\n uses floating point math to represent numbers. As this is a known and\n documented limitation in SQLite itself, and not a quirk of the pysqlite driver,\n"}]}, {"source1": "./usr/share/doc/python-sqlalchemy-doc/html/orm/examples.html", "source2": "./usr/share/doc/python-sqlalchemy-doc/html/orm/examples.html", "comments": ["Ordering differences only"], "unified_diff": "@@ -319,29 +319,29 @@\n \n 
Examples illustrating the asyncio engine feature of SQLAlchemy.
\nListing of files:
greenlet_orm.py - Illustrates use of the sqlalchemy.ext.asyncio.AsyncSession object\n-for asynchronous ORM use, including the optional run_sync() method.
\n-async_orm.py - Illustrates use of the sqlalchemy.ext.asyncio.AsyncSession object\n for asynchronous ORM use.
basic.py - Illustrates the asyncio engine / connection interface.
\n+greenlet_orm.py - Illustrates use of the sqlalchemy.ext.asyncio.AsyncSession object\n+for asynchronous ORM use, including the optional run_sync() method.
\ngather_orm_statements.py - Illustrates how to run many statements concurrently using asyncio.gather()\n along many asyncio database connections, merging ORM results into a single\n AsyncSession.
async_orm_writeonly.py - Illustrates using write only relationships for simpler handling\n of ORM collections under asyncio.
\nbasic.py - Illustrates the asyncio engine / connection interface.
\n+An example of persistence for a directed graph structure.   The\n graph is stored as a collection of edges, each referencing both a\n@@ -378,37 +378,37 @@\n subclassing the HasAddresses mixin, which ensures that the\n parent class is provided with an addresses collection\n which contains Address objects.
The discriminator_on_association.py and generic_fk.py scripts\n are modernized versions of recipes presented in the 2007 blog post\n Polymorphic Associations with SQLAlchemy.
\nListing of files:
table_per_related.py - Illustrates a generic association which persists association\n-objects within individual tables, each one generated to persist\n-those objects on behalf of a particular parent class.
\n-discriminator_on_association.py - Illustrates a mixin which provides a generic association\n using a single target table and a single association table,\n referred to by all parent tables. The association table\n contains a \u201cdiscriminator\u201d column which determines what type of\n parent object associates to each particular row in the association\n table.
\ntable_per_association.py - Illustrates a mixin which provides a generic association\n-via a individually generated association tables for each parent class.\n-The associated objects themselves are persisted in a single table\n-shared among all parents.
\n-generic_fk.py - Illustrates a so-called \u201cgeneric foreign key\u201d, in a similar fashion\n to that of popular frameworks such as Django, ROR, etc. This\n approach bypasses standard referential integrity\n practices, in that the \u201cforeign key\u201d column is not actually\n constrained to refer to any particular table; instead,\n in-application logic is used to determine which table is referenced.
\ntable_per_related.py - Illustrates a generic association which persists association\n+objects within individual tables, each one generated to persist\n+those objects on behalf of a particular parent class.
\n+table_per_association.py - Illustrates a mixin which provides a generic association\n+via a individually generated association tables for each parent class.\n+The associated objects themselves are persisted in a single table\n+shared among all parents.
\n+Illustrates the \u201cmaterialized paths\u201d pattern for hierarchical data using the\n SQLAlchemy ORM.
\n@@ -477,33 +477,33 @@\nSee also
\n \nListing of files:
__main__.py - Allows the examples/performance package to be run as a script.
\n-large_resultsets.py - In this series of tests, we are looking at time to load a large number\n-of very small and simple rows.
\n-single_inserts.py - In this series of tests, we\u2019re looking at a method that inserts a row\n within a distinct transaction, and afterwards returns to essentially a\n \u201cclosed\u201d state. This would be analogous to an API call that starts up\n a database connection, inserts the row, commits and closes.
\nshort_selects.py - This series of tests illustrates different ways to SELECT a single\n record by primary key
\nbulk_inserts.py - This series of tests illustrates different ways to INSERT a large number\n of rows in bulk.
\nbulk_updates.py - This series of tests will illustrate different ways to UPDATE a large number\n of rows in bulk (under construction! there\u2019s just one test at the moment)
\n__main__.py - Allows the examples/performance package to be run as a script.
\n+large_resultsets.py - In this series of tests, we are looking at time to load a large number\n+of very small and simple rows.
\n+This is the default form of run:
\n$ python -m examples.performance single_inserts\n@@ -756,31 +756,31 @@\n Several examples that illustrate the technique of intercepting changes\n that would be first interpreted as an UPDATE on a row, and instead turning\n it into an INSERT of a new row, leaving the previous row intact as\n a historical version.
\n Compare to the Versioning with a History Table example which writes a\n history row to a separate history table.
\n Listing of files:
versioned_rows.py - Illustrates a method to intercept changes on objects, turning\n+an UPDATE statement on a single row into an INSERT statement, so that a new\n+row is inserted with the new data, keeping the old row intact.
\n+versioned_update_old_row.py - Illustrates the same UPDATE into INSERT technique of versioned_rows.py,\n but also emits an UPDATE on the old row to affect a change in timestamp.\n Also includes a SessionEvents.do_orm_execute() hook to limit queries\n to only the most recent version.
versioned_rows_w_versionid.py - Illustrates a method to intercept changes on objects, turning\n an UPDATE statement on a single row into an INSERT statement, so that a new\n row is inserted with the new data, keeping the old row intact.
\nversioned_map.py - A variant of the versioned_rows example built around the\n concept of a \u201cvertical table\u201d structure, like those illustrated in\n Vertical Attribute Mapping examples.
\nversioned_rows.py - Illustrates a method to intercept changes on objects, turning\n-an UPDATE statement on a single row into an INSERT statement, so that a new\n-row is inserted with the new data, keeping the old row intact.
\n-Illustrates \u201cvertical table\u201d mappings.
\n@@ -843,20 +843,20 @@\n system.\nListing of files:
active_column_defaults.py - Illustrates use of the AttributeEvents.init_scalar()\n event, in conjunction with Core column defaults to provide\n ORM objects that automatically produce the default value\n when an un-set attribute is accessed.
custom_management.py - Illustrates customized class instrumentation, using\n-the sqlalchemy.ext.instrumentation extension package.
listen_for_events.py - Illustrates how to attach events to all instrumented attributes\n and listen for change events.
\ncustom_management.py - Illustrates customized class instrumentation, using\n+the sqlalchemy.ext.instrumentation extension package.
A basic example of using the SQLAlchemy Sharding API.\n Sharding refers to horizontally scaling data across multiple\n@@ -887,22 +887,22 @@\n more plain-spoken alternative, the \u201cdistinct entity\u201d approach\n is a simple method of assigning objects to different tables (and potentially\n database nodes) in an explicit way - described on the wiki at\n EntityName.
\nListing of files:
separate_databases.py - Illustrates sharding using distinct SQLite databases.
\nseparate_tables.py - Illustrates sharding using a single SQLite database, that will however\n+have multiple tables using a naming convention.
\n+separate_schema_translates.py - Illustrates sharding using a single database with multiple schemas,\n where a different \u201cschema_translates_map\u201d can be used for each shard.
\nasyncio.py - Illustrates sharding API used with asyncio.
\nseparate_tables.py - Illustrates sharding using a single SQLite database, that will however\n-have multiple tables using a naming convention.
\n-