{
    "id": "cub165-conditional-stock",
    "title": "Списать остаток одним условным UPDATE и отличить отказ от ошибки",
    "columns": [
        "Наблюдение",
        "Результат"
    ],
    "rows": [
        [
            "До списания",
            "Кабель \/ остаток 5"
        ],
        [
            "Запрос 2 шт.",
            "Изменено 1; осталось 3"
        ],
        [
            "Запрос ещё 4 шт.",
            "Изменено 0; осталось 3"
        ],
        [
            "Второй SQL выполнен успешно",
            true
        ],
        [
            "Второе списание принято",
            false
        ]
    ],
    "checks": {
        "first_change": true,
        "insufficient_stock": true,
        "no_negative_stock": true,
        "zero_not_query_failure": true,
        "owned_objects_removed": true
    },
    "observations": {
        "initial": {
            "title": "Кабель",
            "qty": 5
        },
        "operations": [
            {
                "wanted": 2,
                "execute": true,
                "affected": 1,
                "qty": 3
            },
            {
                "wanted": 4,
                "execute": true,
                "affected": 0,
                "qty": 3
            }
        ],
        "predicate_and_decrement_in_one_sql": true,
        "affected_captured_before_readback": true
    },
    "runtime": {
        "php": "7.4.33",
        "extension": "11.2.0.0002",
        "php_extension_metadata": null,
        "server_version": "11.3.5.1274",
        "client_version": "11.2.0",
        "database": "phpmanual165",
        "transport": "isolated_loopback_broker",
        "charset": "utf-8",
        "autocommit": false
    },
    "owned_objects": [
        {
            "type": "TABLE",
            "name": "c165_stock_8bb39627fd"
        }
    ],
    "removed_objects": [
        {
            "type": "TABLE",
            "name": "c165_stock_8bb39627fd"
        }
    ]
}
