Yep, I think we should switch this to gzip in the actual implementation. SARIF files can be quite large, structured JSON with embedded stack traces, code snippets, and rule metadata. Some example SARIF output from tools like Semgrep or CodeQL regularly hits several MB. Gzip typically gives 5–10× compression on JSON.
@emrasmussen disabling the flag does not affect detection. Detection is tied to the specific vulnerable dependency and this flag only changes whether or not we calculate complete dependency paths for rendering. It effectively shows the traceability blast-radius of which top-level dependencies need to be bumped when a vulnerability is detected in their transitive ones. While a useful tool for figuring out which dependencies need to be bumped explicitly, disabling it does not prevent GL from reporting on any known vulnerabilities.
Add last_30_days_usage for AI catalog items
Changelog: added
exec ALTER TABLE ai_catalog_items ADD COLUMN IF NOT EXISTS last_30_day_usage_count integer NOT NULL DEFAULT 0;
# 13 ms
exec ALTER TABLE ai_catalog_items ADD COLUMN IF NOT EXISTS last_30_day_usage_count_updated_at timestamp with time zone NOT NULL DEFAULT '1970-01-01 00:00:00+00'::timestamp;
# 2 ms
exec CREATE INDEX CONCURRENTLY IF NOT EXISTS index_ai_catalog_items_on_last_30_day_usage_count_updated_at ON ai_catalog_items (last_30_day_usage_count_updated_at);
# 27 ms
explain SELECT "ai_catalog_items"."id" FROM "ai_catalog_items" WHERE "ai_catalog_items"."deleted_at" IS NULL LIMIT 1000;
#
# Limit (cost=0.28..120.54 rows=1000 width=8) (actual time=0.027..0.461 rows=1000 loops=1)
# Buffers: shared hit=37
# -> Index Scan using index_ai_catalog_items_where_deleted_at_is_null on public.ai_catalog_items (cost=0.28..373.92 rows=3107 width=8) (actual time=0.025..0.367 rows=1000 loops=1)
# Buffers: shared hit=37
# Settings: seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', random_page_cost = '1.5', work_mem = '230MB'
#
# Time: 1.634 ms
# - planning: 1.086 ms
# - execution: 0.548 ms
# - I/O read: N/A
# - I/O write: N/A
# Shared buffers:
# - hits: 37 (~296.00 KiB) from the buffer pool
# - reads: 0 from the OS file cache, including disk I/O
# - dirtied: 0
# - writes: 0
explain SELECT
ai_catalog_item_versions.ai_catalog_item_id,
COUNT(DISTINCT duo_workflows_workflows.project_id) AS usage_count
FROM duo_workflows_workflows
INNER JOIN ai_catalog_item_versions
ON ai_catalog_item_versions.id = duo_workflows_workflows.ai_catalog_item_version_id
WHERE duo_workflows_workflows.created_at >= '2026-02-01'
AND duo_workflows_workflows.ai_catalog_item_version_id IS NOT NULL
AND duo_workflows_workflows.project_id IS NOT NULL
AND ai_catalog_item_versions.ai_catalog_item_id IN (
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,
101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,
201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,
301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,
401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,
501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,
601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,
701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,
801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,
901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000
)
GROUP BY ai_catalog_item_versions.ai_catalog_item_id;
# Aggregate (cost=1204.75..1218.50 rows=786 width=16) (actual time=5988.113..5988.587 rows=41 loops=1)
# Group Key: ai_catalog_item_versions.ai_catalog_item_id
# Buffers: shared hit=4098 read=11477 dirtied=436
# WAL: records=459 fpi=436 bytes=3419400
# -> Sort (cost=1204.75..1206.71 rows=786 width=16) (actual time=5988.102..5988.249 rows=2986 loops=1)
# Sort Key: ai_catalog_item_versions.ai_catalog_item_id, duo_workflows_workflows.project_id
# Sort Method: quicksort Memory: 190kB
# Buffers: shared hit=4098 read=11477 dirtied=436
# WAL: records=459 fpi=436 bytes=3419400
# -> Merge Join (cost=689.20..1166.95 rows=786 width=16) (actual time=89.299..5985.859 rows=2986 loops=1)
# Merge Cond: (duo_workflows_workflows.ai_catalog_item_version_id = ai_catalog_item_versions.id)
# Buffers: shared hit=4098 read=11477 dirtied=436
# WAL: records=459 fpi=436 bytes=3419400
# -> Index Scan using index_duo_workflows_workflows_on_ai_catalog_item_version_id on public.duo_workflows_workflows (cost=0.42..22421.93 rows=4802 width=16) (actual time=26.304..5919.801 rows=4579 loops=1)
# Index Cond: (duo_workflows_workflows.ai_catalog_item_version_id IS NOT NULL)
# Filter: ((duo_workflows_workflows.project_id IS NOT NULL) AND (duo_workflows_workflows.created_at >= '2026-02-01 00:00:00+00'::timestamp with time zone))
# Rows Removed by Filter: 16113
# Buffers: shared hit=3472 read=11339 dirtied=436
# WAL: records=459 fpi=436 bytes=3419400
# -> Sort (cost=688.78..691.64 rows=1146 width=16) (actual time=62.987..63.135 rows=863 loops=1)
# Sort Key: ai_catalog_item_versions.id
# Sort Method: quicksort Memory: 51kB
# Buffers: shared hit=626 read=138
# -> Index Scan using idx_ai_catalog_item_version_unique on public.ai_catalog_item_versions (cost=0.28..630.55 rows=1146 width=16) (actual time=2.069..62.698 rows=863 loops=1)
# Index Cond: (ai_catalog_item_versions.ai_catalog_item_id = ANY ('{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000}'::bigint[]))
# Buffers: shared hit=626 read=138
# Settings: jit = 'off', random_page_cost = '1.5', work_mem = '230MB', seq_page_cost = '4', effective_cache_size = '472585MB'
UPDATE "ai_catalog_items" SET "last_30_day_usage_count" = CASE "id" WHEN 1 THEN 37 WHEN 2 THEN 74 WHEN 3 THEN 10 WHEN 4 THEN 47 WHEN 5 THEN 84 WHEN 6 THEN 20 WHEN 7 THEN 57 WHEN 8 THEN 94 WHEN 9 THEN 30 WHEN 10 THEN 67 WHEN 11 THEN 3 WHEN 12 THEN 40 WHEN 13 THEN 77 WHEN 14 THEN 13 WHEN 15 THEN 50 WHEN 16 THEN 87 WHEN 17 THEN 23 WHEN 18 THEN 60 WHEN 19 THEN 97 WHEN 20 THEN 33 WHEN 21 THEN 70 WHEN 22 THEN 6 WHEN 23 THEN 43 WHEN 24 THEN 80 WHEN 25 THEN 16 WHEN 26 THEN 53 WHEN 27 THEN 90 WHEN 28 THEN 26 WHEN 29 THEN 63 WHEN 30 THEN 100 WHEN 31 THEN 36 WHEN 32 THEN 73 WHEN 33 THEN 9 WHEN 34 THEN 46 WHEN 35 THEN 83 WHEN 36 THEN 19 WHEN 37 THEN 56 WHEN 38 THEN 93 WHEN 39 THEN 29 WHEN 40 THEN 66 WHEN 41 THEN 2 WHEN 42 THEN 39 WHEN 43 THEN 76 WHEN 44 THEN 12 WHEN 45 THEN 49 WHEN 46 THEN 86 WHEN 47 THEN 22 WHEN 48 THEN 59 WHEN 49 THEN 96 WHEN 50 THEN 32 WHEN 51 THEN 69 WHEN 52 THEN 5 WHEN 53 THEN 42 WHEN 54 THEN 79 WHEN 55 THEN 15 WHEN 56 THEN 52 WHEN 57 THEN 89 WHEN 58 THEN 25 WHEN 59 THEN 62 WHEN 60 THEN 99 WHEN 61 THEN 35 WHEN 62 THEN 72 WHEN 63 THEN 8 WHEN 64 THEN 45 WHEN 65 THEN 82 WHEN 66 THEN 18 WHEN 67 THEN 55 WHEN 68 THEN 92 WHEN 69 THEN 28 WHEN 70 THEN 65 WHEN 71 THEN 1 WHEN 72 THEN 38 WHEN 73 THEN 75 WHEN 74 THEN 11 WHEN 75 THEN 48 WHEN 76 THEN 85 WHEN 77 THEN 21 WHEN 78 THEN 58 WHEN 79 THEN 95 WHEN 80 THEN 31 WHEN 81 THEN 68 WHEN 82 THEN 4 WHEN 83 THEN 41 WHEN 84 THEN 78 WHEN 85 THEN 14 WHEN 86 THEN 51 WHEN 87 THEN 88 WHEN 88 THEN 24 WHEN 89 THEN 61 WHEN 90 THEN 98 WHEN 91 THEN 34 WHEN 92 THEN 71 WHEN 93 THEN 7 WHEN 94 THEN 44 WHEN 95 THEN 81 WHEN 96 THEN 17 WHEN 97 THEN 54 WHEN 98 THEN 91 WHEN 99 THEN 27 WHEN 100 THEN 64 WHEN 101 THEN 0 WHEN 102 THEN 37 WHEN 103 THEN 74 WHEN 104 THEN 10 WHEN 105 THEN 47 WHEN 106 THEN 84 WHEN 107 THEN 20 WHEN 108 THEN 57 WHEN 109 THEN 94 WHEN 110 THEN 30 WHEN 111 THEN 67 WHEN 112 THEN 3 WHEN 113 THEN 40 WHEN 114 THEN 77 WHEN 115 THEN 13 WHEN 116 THEN 50 WHEN 117 THEN 87 WHEN 118 THEN 23 WHEN 119 THEN 60 WHEN 120 THEN 97 WHEN 121 THEN 33 WHEN 122 THEN 70 WHEN 123 THEN 6 WHEN 124 THEN 43 WHEN 125 THEN 80 WHEN 126 THEN 16 WHEN 127 THEN 53 WHEN 128 THEN 90 WHEN 129 THEN 26 WHEN 130 THEN 63 WHEN 131 THEN 100 WHEN 132 THEN 36 WHEN 133 THEN 73 WHEN 134 THEN 9 WHEN 135 THEN 46 WHEN 136 THEN 83 WHEN 137 THEN 19 WHEN 138 THEN 56 WHEN 139 THEN 93 WHEN 140 THEN 29 WHEN 141 THEN 66 WHEN 142 THEN 2 WHEN 143 THEN 39 WHEN 144 THEN 76 WHEN 145 THEN 12 WHEN 146 THEN 49 WHEN 147 THEN 86 WHEN 148 THEN 22 WHEN 149 THEN 59 WHEN 150 THEN 96 WHEN 151 THEN 32 WHEN 152 THEN 69 WHEN 153 THEN 5 WHEN 154 THEN 42 WHEN 155 THEN 79 WHEN 156 THEN 15 WHEN 157 THEN 52 WHEN 158 THEN 89 WHEN 159 THEN 25 WHEN 160 THEN 62 WHEN 161 THEN 99 WHEN 162 THEN 35 WHEN 163 THEN 72 WHEN 164 THEN 8 WHEN 165 THEN 45 WHEN 166 THEN 82 WHEN 167 THEN 18 WHEN 168 THEN 55 WHEN 169 THEN 92 WHEN 170 THEN 28 WHEN 171 THEN 65 WHEN 172 THEN 1 WHEN 173 THEN 38 WHEN 174 THEN 75 WHEN 175 THEN 11 WHEN 176 THEN 48 WHEN 177 THEN 85 WHEN 178 THEN 21 WHEN 179 THEN 58 WHEN 180 THEN 95 WHEN 181 THEN 31 WHEN 182 THEN 68 WHEN 183 THEN 4 WHEN 184 THEN 41 WHEN 185 THEN 78 WHEN 186 THEN 14 WHEN 187 THEN 51 WHEN 188 THEN 88 WHEN 189 THEN 24 WHEN 190 THEN 61 WHEN 191 THEN 98 WHEN 192 THEN 34 WHEN 193 THEN 71 WHEN 194 THEN 7 WHEN 195 THEN 44 WHEN 196 THEN 81 WHEN 197 THEN 17 WHEN 198 THEN 54 WHEN 199 THEN 91 WHEN 200 THEN 27 WHEN 201 THEN 64 WHEN 202 THEN 0 WHEN 203 THEN 37 WHEN 204 THEN 74 WHEN 205 THEN 10 WHEN 206 THEN 47 WHEN 207 THEN 84 WHEN 208 THEN 20 WHEN 209 THEN 57 WHEN 210 THEN 94 WHEN 211 THEN 30 WHEN 212 THEN 67 WHEN 213 THEN 3 WHEN 214 THEN 40 WHEN 215 THEN 77 WHEN 216 THEN 13 WHEN 217 THEN 50 WHEN 218 THEN 87 WHEN 219 THEN 23 WHEN 220 THEN 60 WHEN 221 THEN 97 WHEN 222 THEN 33 WHEN 223 THEN 70 WHEN 224 THEN 6 WHEN 225 THEN 43 WHEN 226 THEN 80 WHEN 227 THEN 16 WHEN 228 THEN 53 WHEN 229 THEN 90 WHEN 230 THEN 26 WHEN 231 THEN 63 WHEN 232 THEN 100 WHEN 233 THEN 36 WHEN 234 THEN 73 WHEN 235 THEN 9 WHEN 236 THEN 46 WHEN 237 THEN 83 WHEN 238 THEN 19 WHEN 239 THEN 56 WHEN 240 THEN 93 WHEN 241 THEN 29 WHEN 242 THEN 66 WHEN 243 THEN 2 WHEN 244 THEN 39 WHEN 245 THEN 76 WHEN 246 THEN 12 WHEN 247 THEN 49 WHEN 248 THEN 86 WHEN 249 THEN 22 WHEN 250 THEN 59 WHEN 251 THEN 96 WHEN 252 THEN 32 WHEN 253 THEN 69 WHEN 254 THEN 5 WHEN 255 THEN 42 WHEN 256 THEN 79 WHEN 257 THEN 15 WHEN 258 THEN 52 WHEN 259 THEN 89 WHEN 260 THEN 25 WHEN 261 THEN 62 WHEN 262 THEN 99 WHEN 263 THEN 35 WHEN 264 THEN 72 WHEN 265 THEN 8 WHEN 266 THEN 45 WHEN 267 THEN 82 WHEN 268 THEN 18 WHEN 269 THEN 55 WHEN 270 THEN 92 WHEN 271 THEN 28 WHEN 272 THEN 65 WHEN 273 THEN 1 WHEN 274 THEN 38 WHEN 275 THEN 75 WHEN 276 THEN 11 WHEN 277 THEN 48 WHEN 278 THEN 85 WHEN 279 THEN 21 WHEN 280 THEN 58 WHEN 281 THEN 95 WHEN 282 THEN 31 WHEN 283 THEN 68 WHEN 284 THEN 4 WHEN 285 THEN 41 WHEN 286 THEN 78 WHEN 287 THEN 14 WHEN 288 THEN 51 WHEN 289 THEN 88 WHEN 290 THEN 24 WHEN 291 THEN 61 WHEN 292 THEN 98 WHEN 293 THEN 34 WHEN 294 THEN 71 WHEN 295 THEN 7 WHEN 296 THEN 44 WHEN 297 THEN 81 WHEN 298 THEN 17 WHEN 299 THEN 54 WHEN 300 THEN 91 WHEN 301 THEN 27 WHEN 302 THEN 64 WHEN 303 THEN 0 WHEN 304 THEN 37 WHEN 305 THEN 74 WHEN 306 THEN 10 WHEN 307 THEN 47 WHEN 308 THEN 84 WHEN 309 THEN 20 WHEN 310 THEN 57 WHEN 311 THEN 94 WHEN 312 THEN 30 WHEN 313 THEN 67 WHEN 314 THEN 3 WHEN 315 THEN 40 WHEN 316 THEN 77 WHEN 317 THEN 13 WHEN 318 THEN 50 WHEN 319 THEN 87 WHEN 320 THEN 23 WHEN 321 THEN 60 WHEN 322 THEN 97 WHEN 323 THEN 33 WHEN 324 THEN 70 WHEN 325 THEN 6 WHEN 326 THEN 43 WHEN 327 THEN 80 WHEN 328 THEN 16 WHEN 329 THEN 53 WHEN 330 THEN 90 WHEN 331 THEN 26 WHEN 332 THEN 63 WHEN 333 THEN 100 WHEN 334 THEN 36 WHEN 335 THEN 73 WHEN 336 THEN 9 WHEN 337 THEN 46 WHEN 338 THEN 83 WHEN 339 THEN 19 WHEN 340 THEN 56 WHEN 341 THEN 93 WHEN 342 THEN 29 WHEN 343 THEN 66 WHEN 344 THEN 2 WHEN 345 THEN 39 WHEN 346 THEN 76 WHEN 347 THEN 12 WHEN 348 THEN 49 WHEN 349 THEN 86 WHEN 350 THEN 22 WHEN 351 THEN 59 WHEN 352 THEN 96 WHEN 353 THEN 32 WHEN 354 THEN 69 WHEN 355 THEN 5 WHEN 356 THEN 42 WHEN 357 THEN 79 WHEN 358 THEN 15 WHEN 359 THEN 52 WHEN 360 THEN 89 WHEN 361 THEN 25 WHEN 362 THEN 62 WHEN 363 THEN 99 WHEN 364 THEN 35 WHEN 365 THEN 72 WHEN 366 THEN 8 WHEN 367 THEN 45 WHEN 368 THEN 82 WHEN 369 THEN 18 WHEN 370 THEN 55 WHEN 371 THEN 92 WHEN 372 THEN 28 WHEN 373 THEN 65 WHEN 374 THEN 1 WHEN 375 THEN 38 WHEN 376 THEN 75 WHEN 377 THEN 11 WHEN 378 THEN 48 WHEN 379 THEN 85 WHEN 380 THEN 21 WHEN 381 THEN 58 WHEN 382 THEN 95 WHEN 383 THEN 31 WHEN 384 THEN 68 WHEN 385 THEN 4 WHEN 386 THEN 41 WHEN 387 THEN 78 WHEN 388 THEN 14 WHEN 389 THEN 51 WHEN 390 THEN 88 WHEN 391 THEN 24 WHEN 392 THEN 61 WHEN 393 THEN 98 WHEN 394 THEN 34 WHEN 395 THEN 71 WHEN 396 THEN 7 WHEN 397 THEN 44 WHEN 398 THEN 81 WHEN 399 THEN 17 WHEN 400 THEN 54 WHEN 401 THEN 91 WHEN 402 THEN 27 WHEN 403 THEN 64 WHEN 404 THEN 0 WHEN 405 THEN 37 WHEN 406 THEN 74 WHEN 407 THEN 10 WHEN 408 THEN 47 WHEN 409 THEN 84 WHEN 410 THEN 20 WHEN 411 THEN 57 WHEN 412 THEN 94 WHEN 413 THEN 30 WHEN 414 THEN 67 WHEN 415 THEN 3 WHEN 416 THEN 40 WHEN 417 THEN 77 WHEN 418 THEN 13 WHEN 419 THEN 50 WHEN 420 THEN 87 WHEN 421 THEN 23 WHEN 422 THEN 60 WHEN 423 THEN 97 WHEN 424 THEN 33 WHEN 425 THEN 70 WHEN 426 THEN 6 WHEN 427 THEN 43 WHEN 428 THEN 80 WHEN 429 THEN 16 WHEN 430 THEN 53 WHEN 431 THEN 90 WHEN 432 THEN 26 WHEN 433 THEN 63 WHEN 434 THEN 100 WHEN 435 THEN 36 WHEN 436 THEN 73 WHEN 437 THEN 9 WHEN 438 THEN 46 WHEN 439 THEN 83 WHEN 440 THEN 19 WHEN 441 THEN 56 WHEN 442 THEN 93 WHEN 443 THEN 29 WHEN 444 THEN 66 WHEN 445 THEN 2 WHEN 446 THEN 39 WHEN 447 THEN 76 WHEN 448 THEN 12 WHEN 449 THEN 49 WHEN 450 THEN 86 WHEN 451 THEN 22 WHEN 452 THEN 59 WHEN 453 THEN 96 WHEN 454 THEN 32 WHEN 455 THEN 69 WHEN 456 THEN 5 WHEN 457 THEN 42 WHEN 458 THEN 79 WHEN 459 THEN 15 WHEN 460 THEN 52 WHEN 461 THEN 89 WHEN 462 THEN 25 WHEN 463 THEN 62 WHEN 464 THEN 99 WHEN 465 THEN 35 WHEN 466 THEN 72 WHEN 467 THEN 8 WHEN 468 THEN 45 WHEN 469 THEN 82 WHEN 470 THEN 18 WHEN 471 THEN 55 WHEN 472 THEN 92 WHEN 473 THEN 28 WHEN 474 THEN 65 WHEN 475 THEN 1 WHEN 476 THEN 38 WHEN 477 THEN 75 WHEN 478 THEN 11 WHEN 479 THEN 48 WHEN 480 THEN 85 WHEN 481 THEN 21 WHEN 482 THEN 58 WHEN 483 THEN 95 WHEN 484 THEN 31 WHEN 485 THEN 68 WHEN 486 THEN 4 WHEN 487 THEN 41 WHEN 488 THEN 78 WHEN 489 THEN 14 WHEN 490 THEN 51 WHEN 491 THEN 88 WHEN 492 THEN 24 WHEN 493 THEN 61 WHEN 494 THEN 98 WHEN 495 THEN 34 WHEN 496 THEN 71 WHEN 497 THEN 7 WHEN 498 THEN 44 WHEN 499 THEN 81 WHEN 500 THEN 17 WHEN 501 THEN 54 WHEN 502 THEN 91 WHEN 503 THEN 27 WHEN 504 THEN 64 WHEN 505 THEN 0 WHEN 506 THEN 37 WHEN 507 THEN 74 WHEN 508 THEN 10 WHEN 509 THEN 47 WHEN 510 THEN 84 WHEN 511 THEN 20 WHEN 512 THEN 57 WHEN 513 THEN 94 WHEN 514 THEN 30 WHEN 515 THEN 67 WHEN 516 THEN 3 WHEN 517 THEN 40 WHEN 518 THEN 77 WHEN 519 THEN 13 WHEN 520 THEN 50 WHEN 521 THEN 87 WHEN 522 THEN 23 WHEN 523 THEN 60 WHEN 524 THEN 97 WHEN 525 THEN 33 WHEN 526 THEN 70 WHEN 527 THEN 6 WHEN 528 THEN 43 WHEN 529 THEN 80 WHEN 530 THEN 16 WHEN 531 THEN 53 WHEN 532 THEN 90 WHEN 533 THEN 26 WHEN 534 THEN 63 WHEN 535 THEN 100 WHEN 536 THEN 36 WHEN 537 THEN 73 WHEN 538 THEN 9 WHEN 539 THEN 46 WHEN 540 THEN 83 WHEN 541 THEN 19 WHEN 542 THEN 56 WHEN 543 THEN 93 WHEN 544 THEN 29 WHEN 545 THEN 66 WHEN 546 THEN 2 WHEN 547 THEN 39 WHEN 548 THEN 76 WHEN 549 THEN 12 WHEN 550 THEN 49 WHEN 551 THEN 86 WHEN 552 THEN 22 WHEN 553 THEN 59 WHEN 554 THEN 96 WHEN 555 THEN 32 WHEN 556 THEN 69 WHEN 557 THEN 5 WHEN 558 THEN 42 WHEN 559 THEN 79 WHEN 560 THEN 15 WHEN 561 THEN 52 WHEN 562 THEN 89 WHEN 563 THEN 25 WHEN 564 THEN 62 WHEN 565 THEN 99 WHEN 566 THEN 35 WHEN 567 THEN 72 WHEN 568 THEN 8 WHEN 569 THEN 45 WHEN 570 THEN 82 WHEN 571 THEN 18 WHEN 572 THEN 55 WHEN 573 THEN 92 WHEN 574 THEN 28 WHEN 575 THEN 65 WHEN 576 THEN 1 WHEN 577 THEN 38 WHEN 578 THEN 75 WHEN 579 THEN 11 WHEN 580 THEN 48 WHEN 581 THEN 85 WHEN 582 THEN 21 WHEN 583 THEN 58 WHEN 584 THEN 95 WHEN 585 THEN 31 WHEN 586 THEN 68 WHEN 587 THEN 4 WHEN 588 THEN 41 WHEN 589 THEN 78 WHEN 590 THEN 14 WHEN 591 THEN 51 WHEN 592 THEN 88 WHEN 593 THEN 24 WHEN 594 THEN 61 WHEN 595 THEN 98 WHEN 596 THEN 34 WHEN 597 THEN 71 WHEN 598 THEN 7 WHEN 599 THEN 44 WHEN 600 THEN 81 WHEN 601 THEN 17 WHEN 602 THEN 54 WHEN 603 THEN 91 WHEN 604 THEN 27 WHEN 605 THEN 64 WHEN 606 THEN 0 WHEN 607 THEN 37 WHEN 608 THEN 74 WHEN 609 THEN 10 WHEN 610 THEN 47 WHEN 611 THEN 84 WHEN 612 THEN 20 WHEN 613 THEN 57 WHEN 614 THEN 94 WHEN 615 THEN 30 WHEN 616 THEN 67 WHEN 617 THEN 3 WHEN 618 THEN 40 WHEN 619 THEN 77 WHEN 620 THEN 13 WHEN 621 THEN 50 WHEN 622 THEN 87 WHEN 623 THEN 23 WHEN 624 THEN 60 WHEN 625 THEN 97 WHEN 626 THEN 33 WHEN 627 THEN 70 WHEN 628 THEN 6 WHEN 629 THEN 43 WHEN 630 THEN 80 WHEN 631 THEN 16 WHEN 632 THEN 53 WHEN 633 THEN 90 WHEN 634 THEN 26 WHEN 635 THEN 63 WHEN 636 THEN 100 WHEN 637 THEN 36 WHEN 638 THEN 73 WHEN 639 THEN 9 WHEN 640 THEN 46 WHEN 641 THEN 83 WHEN 642 THEN 19 WHEN 643 THEN 56 WHEN 644 THEN 93 WHEN 645 THEN 29 WHEN 646 THEN 66 WHEN 647 THEN 2 WHEN 648 THEN 39 WHEN 649 THEN 76 WHEN 650 THEN 12 WHEN 651 THEN 49 WHEN 652 THEN 86 WHEN 653 THEN 22 WHEN 654 THEN 59 WHEN 655 THEN 96 WHEN 656 THEN 32 WHEN 657 THEN 69 WHEN 658 THEN 5 WHEN 659 THEN 42 WHEN 660 THEN 79 WHEN 661 THEN 15 WHEN 662 THEN 52 WHEN 663 THEN 89 WHEN 664 THEN 25 WHEN 665 THEN 62 WHEN 666 THEN 99 WHEN 667 THEN 35 WHEN 668 THEN 72 WHEN 669 THEN 8 WHEN 670 THEN 45 WHEN 671 THEN 82 WHEN 672 THEN 18 WHEN 673 THEN 55 WHEN 674 THEN 92 WHEN 675 THEN 28 WHEN 676 THEN 65 WHEN 677 THEN 1 WHEN 678 THEN 38 WHEN 679 THEN 75 WHEN 680 THEN 11 WHEN 681 THEN 48 WHEN 682 THEN 85 WHEN 683 THEN 21 WHEN 684 THEN 58 WHEN 685 THEN 95 WHEN 686 THEN 31 WHEN 687 THEN 68 WHEN 688 THEN 4 WHEN 689 THEN 41 WHEN 690 THEN 78 WHEN 691 THEN 14 WHEN 692 THEN 51 WHEN 693 THEN 88 WHEN 694 THEN 24 WHEN 695 THEN 61 WHEN 696 THEN 98 WHEN 697 THEN 34 WHEN 698 THEN 71 WHEN 699 THEN 7 WHEN 700 THEN 44 WHEN 701 THEN 81 WHEN 702 THEN 17 WHEN 703 THEN 54 WHEN 704 THEN 91 WHEN 705 THEN 27 WHEN 706 THEN 64 WHEN 707 THEN 0 WHEN 708 THEN 37 WHEN 709 THEN 74 WHEN 710 THEN 10 WHEN 711 THEN 47 WHEN 712 THEN 84 WHEN 713 THEN 20 WHEN 714 THEN 57 WHEN 715 THEN 94 WHEN 716 THEN 30 WHEN 717 THEN 67 WHEN 718 THEN 3 WHEN 719 THEN 40 WHEN 720 THEN 77 WHEN 721 THEN 13 WHEN 722 THEN 50 WHEN 723 THEN 87 WHEN 724 THEN 23 WHEN 725 THEN 60 WHEN 726 THEN 97 WHEN 727 THEN 33 WHEN 728 THEN 70 WHEN 729 THEN 6 WHEN 730 THEN 43 WHEN 731 THEN 80 WHEN 732 THEN 16 WHEN 733 THEN 53 WHEN 734 THEN 90 WHEN 735 THEN 26 WHEN 736 THEN 63 WHEN 737 THEN 100 WHEN 738 THEN 36 WHEN 739 THEN 73 WHEN 740 THEN 9 WHEN 741 THEN 46 WHEN 742 THEN 83 WHEN 743 THEN 19 WHEN 744 THEN 56 WHEN 745 THEN 93 WHEN 746 THEN 29 WHEN 747 THEN 66 WHEN 748 THEN 2 WHEN 749 THEN 39 WHEN 750 THEN 76 WHEN 751 THEN 12 WHEN 752 THEN 49 WHEN 753 THEN 86 WHEN 754 THEN 22 WHEN 755 THEN 59 WHEN 756 THEN 96 WHEN 757 THEN 32 WHEN 758 THEN 69 WHEN 759 THEN 5 WHEN 760 THEN 42 WHEN 761 THEN 79 WHEN 762 THEN 15 WHEN 763 THEN 52 WHEN 764 THEN 89 WHEN 765 THEN 25 WHEN 766 THEN 62 WHEN 767 THEN 99 WHEN 768 THEN 35 WHEN 769 THEN 72 WHEN 770 THEN 8 WHEN 771 THEN 45 WHEN 772 THEN 82 WHEN 773 THEN 18 WHEN 774 THEN 55 WHEN 775 THEN 92 WHEN 776 THEN 28 WHEN 777 THEN 65 WHEN 778 THEN 1 WHEN 779 THEN 38 WHEN 780 THEN 75 WHEN 781 THEN 11 WHEN 782 THEN 48 WHEN 783 THEN 85 WHEN 784 THEN 21 WHEN 785 THEN 58 WHEN 786 THEN 95 WHEN 787 THEN 31 WHEN 788 THEN 68 WHEN 789 THEN 4 WHEN 790 THEN 41 WHEN 791 THEN 78 WHEN 792 THEN 14 WHEN 793 THEN 51 WHEN 794 THEN 88 WHEN 795 THEN 24 WHEN 796 THEN 61 WHEN 797 THEN 98 WHEN 798 THEN 34 WHEN 799 THEN 71 WHEN 800 THEN 7 WHEN 801 THEN 44 WHEN 802 THEN 81 WHEN 803 THEN 17 WHEN 804 THEN 54 WHEN 805 THEN 91 WHEN 806 THEN 27 WHEN 807 THEN 64 WHEN 808 THEN 0 WHEN 809 THEN 37 WHEN 810 THEN 74 WHEN 811 THEN 10 WHEN 812 THEN 47 WHEN 813 THEN 84 WHEN 814 THEN 20 WHEN 815 THEN 57 WHEN 816 THEN 94 WHEN 817 THEN 30 WHEN 818 THEN 67 WHEN 819 THEN 3 WHEN 820 THEN 40 WHEN 821 THEN 77 WHEN 822 THEN 13 WHEN 823 THEN 50 WHEN 824 THEN 87 WHEN 825 THEN 23 WHEN 826 THEN 60 WHEN 827 THEN 97 WHEN 828 THEN 33 WHEN 829 THEN 70 WHEN 830 THEN 6 WHEN 831 THEN 43 WHEN 832 THEN 80 WHEN 833 THEN 16 WHEN 834 THEN 53 WHEN 835 THEN 90 WHEN 836 THEN 26 WHEN 837 THEN 63 WHEN 838 THEN 100 WHEN 839 THEN 36 WHEN 840 THEN 73 WHEN 841 THEN 9 WHEN 842 THEN 46 WHEN 843 THEN 83 WHEN 844 THEN 19 WHEN 845 THEN 56 WHEN 846 THEN 93 WHEN 847 THEN 29 WHEN 848 THEN 66 WHEN 849 THEN 2 WHEN 850 THEN 39 WHEN 851 THEN 76 WHEN 852 THEN 12 WHEN 853 THEN 49 WHEN 854 THEN 86 WHEN 855 THEN 22 WHEN 856 THEN 59 WHEN 857 THEN 96 WHEN 858 THEN 32 WHEN 859 THEN 69 WHEN 860 THEN 5 WHEN 861 THEN 42 WHEN 862 THEN 79 WHEN 863 THEN 15 WHEN 864 THEN 52 WHEN 865 THEN 89 WHEN 866 THEN 25 WHEN 867 THEN 62 WHEN 868 THEN 99 WHEN 869 THEN 35 WHEN 870 THEN 72 WHEN 871 THEN 8 WHEN 872 THEN 45 WHEN 873 THEN 82 WHEN 874 THEN 18 WHEN 875 THEN 55 WHEN 876 THEN 92 WHEN 877 THEN 28 WHEN 878 THEN 65 WHEN 879 THEN 1 WHEN 880 THEN 38 WHEN 881 THEN 75 WHEN 882 THEN 11 WHEN 883 THEN 48 WHEN 884 THEN 85 WHEN 885 THEN 21 WHEN 886 THEN 58 WHEN 887 THEN 95 WHEN 888 THEN 31 WHEN 889 THEN 68 WHEN 890 THEN 4 WHEN 891 THEN 41 WHEN 892 THEN 78 WHEN 893 THEN 14 WHEN 894 THEN 51 WHEN 895 THEN 88 WHEN 896 THEN 24 WHEN 897 THEN 61 WHEN 898 THEN 98 WHEN 899 THEN 34 WHEN 900 THEN 71 WHEN 901 THEN 7 WHEN 902 THEN 44 WHEN 903 THEN 81 WHEN 904 THEN 17 WHEN 905 THEN 54 WHEN 906 THEN 91 WHEN 907 THEN 27 WHEN 908 THEN 64 WHEN 909 THEN 0 WHEN 910 THEN 37 WHEN 911 THEN 74 WHEN 912 THEN 10 WHEN 913 THEN 47 WHEN 914 THEN 84 WHEN 915 THEN 20 WHEN 916 THEN 57 WHEN 917 THEN 94 WHEN 918 THEN 30 WHEN 919 THEN 67 WHEN 920 THEN 3 WHEN 921 THEN 40 WHEN 922 THEN 77 WHEN 923 THEN 13 WHEN 924 THEN 50 WHEN 925 THEN 87 WHEN 926 THEN 23 WHEN 927 THEN 60 WHEN 928 THEN 97 WHEN 929 THEN 33 WHEN 930 THEN 70 WHEN 931 THEN 6 WHEN 932 THEN 43 WHEN 933 THEN 80 WHEN 934 THEN 16 WHEN 935 THEN 53 WHEN 936 THEN 90 WHEN 937 THEN 26 WHEN 938 THEN 63 WHEN 939 THEN 100 WHEN 940 THEN 36 WHEN 941 THEN 73 WHEN 942 THEN 9 WHEN 943 THEN 46 WHEN 944 THEN 83 WHEN 945 THEN 19 WHEN 946 THEN 56 WHEN 947 THEN 93 WHEN 948 THEN 29 WHEN 949 THEN 66 WHEN 950 THEN 2 WHEN 951 THEN 39 WHEN 952 THEN 76 WHEN 953 THEN 12 WHEN 954 THEN 49 WHEN 955 THEN 86 WHEN 956 THEN 22 WHEN 957 THEN 59 WHEN 958 THEN 96 WHEN 959 THEN 32 WHEN 960 THEN 69 WHEN 961 THEN 5 WHEN 962 THEN 42 WHEN 963 THEN 79 WHEN 964 THEN 15 WHEN 965 THEN 52 WHEN 966 THEN 89 WHEN 967 THEN 25 WHEN 968 THEN 62 WHEN 969 THEN 99 WHEN 970 THEN 35 WHEN 971 THEN 72 WHEN 972 THEN 8 WHEN 973 THEN 45 WHEN 974 THEN 82 WHEN 975 THEN 18 WHEN 976 THEN 55 WHEN 977 THEN 92 WHEN 978 THEN 28 WHEN 979 THEN 65 WHEN 980 THEN 1 WHEN 981 THEN 38 WHEN 982 THEN 75 WHEN 983 THEN 11 WHEN 984 THEN 48 WHEN 985 THEN 85 WHEN 986 THEN 21 WHEN 987 THEN 58 WHEN 988 THEN 95 WHEN 989 THEN 31 WHEN 990 THEN 68 WHEN 991 THEN 4 WHEN 992 THEN 41 WHEN 993 THEN 78 WHEN 994 THEN 14 WHEN 995 THEN 51 WHEN 996 THEN 88 WHEN 997 THEN 24 WHEN 998 THEN 61 WHEN 999 THEN 98 WHEN 1000 THEN 34 END, "last_30_day_usage_count_updated_at" = NOW() WHERE "id" IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000);
# ModifyTable on public.ai_catalog_items (cost=0.28..2664.37 rows=0 width=0) (actual time=87.012..87.013 rows=0 loops=1)
# Buffers: shared hit=19973 read=83 dirtied=193 written=38
# WAL: records=9373 fpi=154 bytes=1839039
# -> Index Scan using ai_catalog_items_pkey on public.ai_catalog_items (cost=0.28..2664.37 rows=1000 width=18) (actual time=1.133..5.333 rows=717 loops=1)
# Index Cond: (ai_catalog_items.id = ANY ('{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000}'::bigint[]))
# Buffers: shared hit=504 read=2
# Settings: jit = 'off', random_page_cost = '1.5', work_mem = '230MB', seq_page_cost = '4', effective_cache_size = '472585MB'
#
# Time: 89.926 ms
# - planning: 2.350 ms
# - execution: 87.576 ms
# - I/O read: N/A
# - I/O write: N/A
#
# Shared buffers:
# - hits: 19973 (~156.00 MiB) from the buffer pool
# - reads: 83 (~664.00 KiB) from the OS file cache, including disk I/O
# - dirtied: 193 (~1.50 MiB)
# - writes: 38 (~304.00 KiB)
explain SELECT * FROM ai_catalog_items ORDER BY last_30_day_usage_count ASC;
# Sort (cost=867.75..878.80 rows=4419 width=273) (actual time=2.769..3.068 rows=3688 loops=1)
# Sort Key: ai_catalog_items.last_30_day_usage_count
# Sort Method: quicksort Memory: 982kB
# Buffers: shared hit=142 dirtied=99
# WAL: records=110 fpi=99 bytes=809751
# -> Seq Scan on public.ai_catalog_items (cost=0.00..600.19 rows=4419 width=273) (actual time=0.043..1.428 rows=3688 loops=1)
# Buffers: shared hit=139 dirtied=99
# WAL: records=110 fpi=99 bytes=809751
# Settings: work_mem = '230MB', seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', random_page_cost = '1.5'
#
# Time: 4.448 ms
# - planning: 1.145 ms
# - execution: 3.303 ms
# - I/O read: N/A
# - I/O write: N/A
#
# Shared buffers:
# - hits: 142 (~1.10 MiB) from the buffer pool
# - reads: 0 from the OS file cache, including disk I/O
# - dirtied: 99 (~792.00 KiB)
# - writes: 0
#
explain SELECT * FROM ai_catalog_items ORDER BY last_30_day_usage_count DESC;
# Sort (cost=867.75..878.80 rows=4419 width=273) (actual time=2.656..2.990 rows=3688 loops=1)
# Sort Key: ai_catalog_items.last_30_day_usage_count DESC
# Sort Method: quicksort Memory: 982kB
# Buffers: shared hit=142
# -> Seq Scan on public.ai_catalog_items (cost=0.00..600.19 rows=4419 width=273) (actual time=0.016..1.001 rows=3688 loops=1)
# Buffers: shared hit=139
# Settings: seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', random_page_cost = '1.5', work_mem = '230MB'
#
# Time: 4.495 ms
# - planning: 1.252 ms
# - execution: 3.243 ms
# - I/O read: N/A
# - I/O write: N/A
#
# Shared buffers:
# - hits: 142 (~1.10 MiB) from the buffer pool
# - reads: 0 from the OS file cache, including disk I/O
# - dirtied: 0
# - writes: 0
| Before | After |
|---|---|
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
@mclausen35 How realistic are any of these scenarios? We do need a strategy for deduplicating SARIF and SAST results, however is this actually a common concern?
When we have a customer interested in SARIF ingestion, are they realistically running GitLab Advanced SAST directly alongside their scanners, covering the same language/files, and expecting seamless deduplication?
@mclausen35 Answering out of order to make this a bit easier
Also @theoretick in your example, are you saying that we dedupe based on OWASP A1 - injection, and not the CWE itself?
Yes, that's how the current report logic works. We filter out generic identifiers, like CWE, but we have failed/forgotten to do so for OWASP.
I thought ruleID referred to the latter.
Assuming this is a reference to the SARIF field specifically, but my response is more generic. The SARIF proposal derives the primary identifier from ruleID and secondary identifiers from assorted fields like properties.tags. I've just added this internal note of a field survey for reference. You don't need to read it, but it's there if we find it helpful.
... true duplications of findings from different scanners?
This is where we likely need some formal definitions around what a "duplicate" is if it comes from different scanners. For example, what if one description is more detailed but the line number and identifiers are identical? Maybe a better framing is "resolution strategies" and "match conditions":
Resolution strategies (when a match is found, what survives):
Match conditions (when are two findings considered the same):
My proposal is to narrow the existing duplication in favor of coexistence, but either way we should define what match conditions we continue to use any deduplication.
Lucas Charles (677fabea) at 17 Mar 13:27
fix: Use fully qualified ReactiveCaching::InvalidateReactiveCache
Mmm this is causing the rspec-fast-fail. This fix is too broad.
Since compare_reports is also used by REST controller endpoints the controllers handle InvalidateReactiveCache themselves and include polling, so the exception propagating is expected.
I think compare_codequality_reports is the only caller that goes through GraphQL, where there's no controller-level rescue and the exception becomes a GraphQL error triggering the toast. I'll move this rescue there.
@uokeadu
Guards against MRs with no pipeline. Previously, calling authorize!(nil) when diff_head_pipeline is absent would raise ResourceNotAvailable triggering the same GraphQL error toast. The resolver now returns nil
early, matching the field's null: true contract.
I believe this should optimize for the more common case, pipeline not ready/existing over unauthorized pipeline access
Lucas Charles (f0b0e4cb) at 17 Mar 12:16
fix: Use fully qualified ReactiveCaching::InvalidateReactiveCache
... and 1 more commit
@GitLabDuo MergeRequest namespace. It should be fine as-is.
@GitLabDuo ReactiveCaching is already included in the class on line 18 and similarly referenced on line 2305
This error is actually returned for both Code Quality and Security scanner findings but the previous fix only addressed security scanners.
Let's try again with CQ !227555
Follow-up ot previous MR !224505 which fixed this for Security Reports
Handle InvalidateReactiveCache in MR CQ report service
When loading a merge request immediately after pushing a commit, users see a transient error 'Something went wrong fetching the scanner findings'. This occurs due to a race condition in the reactive caching mechanism - when cached data is stale, InvalidateReactiveCache is raised, causing the GraphQL query to fail.
This change catches InvalidateReactiveCache and returns { status: :parsing } instead of propagating the error. This ensures the frontend receives a valid response and continues polling until the background job completes.
Relates to #458219
Lucas Charles (6a18d8d6) at 16 Mar 21:16
Handle InvalidateReactiveCache in MR CQ report service
Lucas Charles (3f001081) at 16 Mar 20:35
feat: surface SARIF findings in the MR security diff widget
@minac that sounds sufficient to me!