@@ -1307,50 +1307,16 @@ jsonSelectivityExists(JsonStats stats, Datum key)
1307
1307
return sel ;
1308
1308
}
1309
1309
1310
- /*
1311
- * jsonb_sel
1312
- * The main procedure estimating selectivity for all JSONB operators.
1313
- */
1314
- Datum
1315
- jsonb_sel (PG_FUNCTION_ARGS )
1310
+ static Selectivity
1311
+ jsonb_sel_internal (JsonStats stats , Oid operator , Const * cnst , bool varonleft )
1316
1312
{
1317
- PlannerInfo * root = (PlannerInfo * ) PG_GETARG_POINTER (0 );
1318
- Oid operator = PG_GETARG_OID (1 );
1319
- List * args = (List * ) PG_GETARG_POINTER (2 );
1320
- int varRelid = PG_GETARG_INT32 (3 );
1321
- double sel = DEFAULT_JSON_CONTAINS_SEL ;
1322
- Node * other ;
1323
- Const * cnst ;
1324
- bool varonleft ;
1325
- JsonStatData stats ;
1326
- VariableStatData vardata ;
1327
-
1328
- if (!get_restriction_variable (root , args , varRelid ,
1329
- & vardata , & other , & varonleft ))
1330
- PG_RETURN_FLOAT8 (sel );
1331
-
1332
- if (!IsA (other , Const ))
1333
- goto out ;
1334
-
1335
- cnst = (Const * ) other ;
1336
-
1337
- if (cnst -> constisnull )
1338
- {
1339
- sel = 0.0 ;
1340
- goto out ;
1341
- }
1342
-
1343
- if (!jsonStatsInit (& stats , & vardata ))
1344
- goto out ;
1345
-
1346
1313
switch (operator )
1347
1314
{
1348
1315
case JsonbExistsOperator :
1349
1316
if (!varonleft || cnst -> consttype != TEXTOID )
1350
- goto out ;
1317
+ break ;
1351
1318
1352
- sel = jsonSelectivityExists (& stats , cnst -> constvalue );
1353
- break ;
1319
+ return jsonSelectivityExists (stats , cnst -> constvalue );
1354
1320
1355
1321
case JsonbExistsAnyOperator :
1356
1322
case JsonbExistsAllOperator :
@@ -1363,15 +1329,15 @@ jsonb_sel(PG_FUNCTION_ARGS)
1363
1329
bool all = operator == JsonbExistsAllOperator ;
1364
1330
1365
1331
if (!varonleft || cnst -> consttype != TEXTARRAYOID )
1366
- goto out ;
1332
+ break ;
1367
1333
1368
1334
deconstruct_array (DatumGetArrayTypeP (cnst -> constvalue ), TEXTOID ,
1369
1335
-1 , false, 'i' , & keys , & nulls , & nkeys );
1370
1336
1371
1337
for (i = 0 ; i < nkeys ; i ++ )
1372
1338
if (!nulls [i ])
1373
1339
{
1374
- Selectivity pathfreq = jsonSelectivityExists (& stats ,
1340
+ Selectivity pathfreq = jsonSelectivityExists (stats ,
1375
1341
keys [i ]);
1376
1342
freq *= all ? pathfreq : (1.0 - pathfreq );
1377
1343
}
@@ -1382,30 +1348,69 @@ jsonb_sel(PG_FUNCTION_ARGS)
1382
1348
if (!all )
1383
1349
freq = 1.0 - freq ;
1384
1350
1385
- sel = freq ;
1386
- break ;
1351
+ return freq ;
1387
1352
}
1388
1353
1389
1354
case JsonbContainedOperator :
1390
1355
if (varonleft || cnst -> consttype != JSONBOID )
1391
- goto out ;
1356
+ break ;
1392
1357
1393
- sel = jsonSelectivityContains (& stats ,
1394
- DatumGetJsonbP (cnst -> constvalue ));
1395
- break ;
1358
+ return jsonSelectivityContains (stats ,
1359
+ DatumGetJsonbP (cnst -> constvalue ));
1396
1360
1397
1361
case JsonbContainsOperator :
1398
1362
if (!varonleft || cnst -> consttype != JSONBOID )
1399
- goto out ;
1363
+ break ;
1400
1364
1401
- sel = jsonSelectivityContains (& stats ,
1402
- DatumGetJsonbP (cnst -> constvalue ));
1365
+ return jsonSelectivityContains (stats ,
1366
+ DatumGetJsonbP (cnst -> constvalue ));
1367
+
1368
+ default :
1403
1369
break ;
1404
1370
}
1405
1371
1406
- out :
1407
- jsonStatsRelease (& stats );
1408
- ReleaseVariableStats (vardata );
1372
+ return DEFAULT_JSON_CONTAINS_SEL ;
1373
+ }
1374
+
1375
+ /*
1376
+ * jsonb_sel
1377
+ * The main procedure estimating selectivity for all JSONB operators.
1378
+ */
1379
+ Datum
1380
+ jsonb_sel (PG_FUNCTION_ARGS )
1381
+ {
1382
+ PlannerInfo * root = (PlannerInfo * ) PG_GETARG_POINTER (0 );
1383
+ Oid operator = PG_GETARG_OID (1 );
1384
+ List * args = (List * ) PG_GETARG_POINTER (2 );
1385
+ int varRelid = PG_GETARG_INT32 (3 );
1386
+ double sel = DEFAULT_JSON_CONTAINS_SEL ;
1387
+ Node * other ;
1388
+ bool varonleft ;
1389
+ VariableStatData vardata ;
1390
+
1391
+ if (get_restriction_variable (root , args , varRelid ,
1392
+ & vardata , & other , & varonleft ))
1393
+ {
1394
+ if (IsA (other , Const ))
1395
+ {
1396
+ Const * cnst = (Const * ) other ;
1397
+
1398
+ if (cnst -> constisnull )
1399
+ sel = 0.0 ;
1400
+ else
1401
+ {
1402
+ JsonStatData stats ;
1403
+
1404
+ if (jsonStatsInit (& stats , & vardata ))
1405
+ {
1406
+ sel = jsonb_sel_internal (& stats , operator , cnst , varonleft );
1407
+ jsonStatsRelease (& stats );
1408
+ }
1409
+ }
1410
+ }
1411
+
1412
+ ReleaseVariableStats (vardata );
1413
+ }
1409
1414
1410
1415
PG_RETURN_FLOAT8 ((float8 ) sel );
1411
1416
}
0 commit comments