Backend 8.0.0B4 crash on SELECT ... - Mailing list pgsql-hackers

From James Robinson
Subject Backend 8.0.0B4 crash on SELECT ...
Date
Msg-id CAC85671-2F55-11D9-9079-000A9566A412@socialserve.com
Whole thread Raw
Responses Re: Backend 8.0.0B4 crash on SELECT ...  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
I can reproduce a 8.0.0B4 backend crash on OSX 1.3.5. I can't even get 
it to analyze the query to get an idea of what the plan it is trying. 
What can I do to help diagnose what is going on?

Here's the query:

SELECT unit.id FROM unit WHERE  unit.delete = 'f' AND unit.status=2AND (            (unit.rent >= 100.0 AND unit.rent
<=600.0)            OR (unit.rent_type = 2 AND (                    (unit.slidinglow >= 100.0 AND unit.slidinglow <=
600.0)                   OR (unit.slidinglow < 100.0 AND unit.rent > 600.0)            )))AND unit.belowHUDFMR = 't'
ANDunit.features & 1::INT8 =1::INT8;
 

Basically, it is trying to pull in all available (status=2) rental 
(unit.features & 1::INT8 =1::INT8) unit listings between 100 and 600 
dollars per month (rent_type 2 is sliding scale rent, which we have to 
test for any overlap between the query values and the listing's sliding 
scale rent range). This query was produced by a bug in our middleware, 
neglecting to include city-limiting clauses (hence then being able to 
use an index, specifically "unit_rental_search". But still, pg ought 
not to belly up.

It works on 8.0.0B3, with query plan:
 Seq Scan on unit  (cost=0.00..2480.16 rows=11 width=8) (actual 
time=0.242..452.632 rows=2326 loops=1)   Filter: (("delete" = false) AND (status = 2) AND (((rent >= 
100::double precision) AND (rent <= 600::double precision)) OR 
((rent_type = 2) AND (((slidinglow >= 100::double precision) AND 
(slidinglow <= 600::double precision)) OR ((slidinglow < 100::double 
precision) AND (rent > 600::double precision))))) AND (belowhudfmr = 
true) AND ((features & 1::bigint) = 1::bigint)) Total runtime: 464.402 ms

(2326 rows returned)

Here's the backtrace ...

#0  0x900429ac in kill ()
#1  0x9009eb1c in abort ()
#2  0x002c10f4 in ExceptionalCondition (conditionName=0x31fd18 
"!(((((Node*)(restrictinfo))->type) == T_RestrictInfo))", 
errorType=0x2fca7c "FailedAssertion", fileName=0x31fe60 "indxpath.c", 
lineNumber=853) at assert.c:51
#3  0x00186948 in pred_test_restrict_list (predicate=0xc7f444, 
restrictinfo_list=0xc8176c) at indxpath.c:853
#4  0x00186890 in pred_test_recurse_pred (predicate=0xc7f444, 
restrictinfo_list=0xc8176c) at indxpath.c:834
#5  0x001866cc in pred_test (predicate_list=0xc7f484, 
restrictinfo_list=0xc8176c) at indxpath.c:788
#6  0x0018bb60 in best_or_subclause_index (root=0x201ff38, 
rel=0x20200e4, subclause=0xc7fef0, retIndexInfo=0xbfffdf8c, 
retIndexClauses=0xbfffdf90, retIndexQuals=0xbfffdf94, 
retStartupCost=0xbfffdf98, retTotalCost=0xbfffdfa0) at orindxpath.c:379
#7  0x0018b8dc in best_or_subclause_indexes (root=0x201ff38, 
rel=0x20200e4, subclauses=0xc7f9ec) at orindxpath.c:264
#8  0x0018b7d8 in create_or_index_paths (root=0x201ff38, rel=0x20200e4) 
at orindxpath.c:207
#9  0x001804c0 in set_plain_rel_pathlist (root=0x201ff38, 
rel=0x20200e4, rte=0x201ffc4) at allpaths.c:181
#10 0x00180400 in set_base_rel_pathlists (root=0x201ff38) at 
allpaths.c:135
#11 0x001801b8 in make_one_rel (root=0x201ff38) at allpaths.c:79
#12 0x00194604 in query_planner (root=0x201ff38, tlist=0xc7b2c4, 
tuple_fraction=0, cheapest_path=0xbfffe278, sorted_path=0xbfffe27c) at 
planmain.c:154
#13 0x00195b28 in grouping_planner (parse=0x201ff38, tuple_fraction=0) 
at planner.c:935
#14 0x00194d6c in subquery_planner (parse=0x201ff38, tuple_fraction=0) 
at planner.c:326
#15 0x001948b4 in planner (parse=0x201ff38, isCursor=0 '\0', 
cursorOptions=0, boundParams=0x0) at planner.c:129
#16 0x001fdbb8 in pg_plan_query (querytree=0x201ff38, boundParams=0x0) 
at postgres.c:647
#17 0x001fdd04 in pg_plan_queries (querytrees=0xc7b24c, 
boundParams=0x0, needSnapshot=0 '\0') at postgres.c:715
#18 0x001fe02c in exec_simple_query (query_string=0x201e634 "SELECT 
unit.id FROM unit WHERE  unit.delete = 'f' AND unit.status=2\nAND 
(\n(unit.rent >= 100.0 AND unit.rent <= 600.0)\nOR (unit.rent_type = 2 
AND (\n(unit.slidinglow >= 100.0 AND unit.slidinglow <= 600."...) at 
postgres.c:874
#19 0x00201a0c in PostgresMain (argc=5, argv=0x2001c74, 
username=0x2001c4c "social") at postgres.c:2961
#20 0x001b29e0 in BackendRun (port=0xd00e70) at postmaster.c:2773
#21 0x001b1dfc in BackendStartup (port=0xd00e70) at postmaster.c:2399
#22 0x001af454 in ServerLoop () at postmaster.c:1144
#23 0x001aec64 in PostmasterMain (argc=6, argv=0xd00760) at 
postmaster.c:863
#24 0x001539ec in main (argc=6, argv=0xd00760) at main.c:270

Here's the table and index definitions ...

(sorry table is *huge* -- gotta bust it up one of these days).

social=# \d unit                     Table "public.unit"        Column         |           Type           | Modifiers
-----------------------+--------------------------+----------- id                    | bigint                   | not
nullcity                  | bigint                   | zipcode               | bigint                   | building
       | bigint                   | waitinglist_id        | bigint                   | leadpaintunit         | bigint
               | status                | integer                  | not null features              | bigint
     | deletedate            | timestamp with time zone | lastupdatedate        | timestamp with time zone | delete
          | boolean                  | not null version               | integer                  | not null rent_type
         | integer                  | not null rent                  | double precision         | not null slidinglow
        | double precision         | not null median_rent_20        | double precision         | median_rent_30
|double precision         | median_rent_40        | double precision         | median_rent_50        | double precision
       | median_rent_60        | double precision         | securitydeposit       | double precision         | not null
minimumlease         | double precision         | not null income_based_ss_rent  | boolean                  |
medianrentnorealrent | boolean                  | not null negotiabledeposit     | boolean                  |
forsaleprice         | integer                  | minimum_down_payment  | integer                  |
forsale_sliding_low  | integer                  | homeowner_fee         | integer                  |
negotiabledownpayment| boolean                  | bedroom               | double precision         | not null bathroom
           | double precision         | not null yearbuilt             | integer                  | not null
maxoccupancyadult    | integer                  | not null maxoccupancychild     | integer                  | not null
squarefeet           | integer                  | not null section8              | boolean                  | not null
pets                 | boolean                  | not null smoking               | boolean                  | not null
furniture            | boolean                  | not null availabledate         | timestamp with time zone |
marketdate           | timestamp with time zone | postdate              | timestamp with time zone | fridge
  | boolean                  | not null washer                | boolean                  | not null washerhookup
 | boolean                  | not null dryer                 | boolean                  | not null gasincluded
| boolean                  | not null electricincluded      | boolean                  | not null waterincluded
|boolean                  | not null gasheat               | boolean                  | not null oilheat
|boolean                  | not null electricheat          | boolean                  | not null electricwater
|boolean                  | not null gaswater              | boolean                  | not null taxcredit
|boolean                  | not null subsidized            | boolean                  | not null senior
|boolean                  | not null seniorlicensed        | boolean                  | not null leadpaint
|boolean                  | not null air                   | boolean                  | not null dishwasher
|boolean                  | not null trashcollection       | boolean                  | not null yardmaintenance
|boolean                  | not null belowhudfmr           | boolean                  | not null deck
|boolean                  | purchasemoreparking   | boolean                  | trashpickup           | boolean
       | basementtype          | integer                  | parkingtype           | integer                  |
yardmaintenancetype  | integer                  | parkingspaces         | integer                  | parkingfee
  | double precision         | trashpickupfee        | double precision         | yardmaintenancefee    | double
precision        | pubxport_blocks       | integer                  | not null access                | boolean
       | not null represents            | integer                  | not null available_count       | integer
      | not null waiting_list          | boolean                  | not null type                  | text
     | street                | text                     | street2               | text                     |
description          | text                     | petsconditions        | text                     | stovetype
  | text                     | flooring              | text                     | promotion             | text
          | amenities             | text                     | parkingcomment        | text                     |
qualifiers           | text                     | upgrades_addons       | text                     | lastmodusername
  | text                     | sliding_qualifiers    | text                     |
 
Indexes:    "unit_pkey" PRIMARY KEY, btree (id)    "unit_building" btree (building, represents)
"unit_forsale_search"btree (city, forsaleprice) WHERE forsaleprice > 0    "unit_rental_search" btree (city, status,
belowhudfmr,"delete") 
 
WHERE statu
s = 2 AND belowhudfmr = true AND "delete" = false    "unit_sys_disabled" btree (building, status) WHERE status = 8
Foreign-key constraints:    "unit_building_fkey" FOREIGN KEY (building) REFERENCES building(id)    "unit_city_fkey"
FOREIGNKEY (city) REFERENCES housingcity(id)    "unit_leadpaintunit_fkey" FOREIGN KEY (leadpaintunit) REFERENCES 
 
leadpaintun
it(id)    "unit_waitinglist_id_fkey" FOREIGN KEY (waitinglist_id) REFERENCES 
waiting_l
ist(id)    "unit_zipcode_fkey" FOREIGN KEY (zipcode) REFERENCES zipcode(id)


----
James Robinson
Socialserve.com



pgsql-hackers by date:

Previous
From: "Joshua D. Drake"
Date:
Subject: Re: [PATCHES] CVS should die
Next
From: Joachim Wieland
Date:
Subject: Re: Documentation on PITR still scarce