{"action":"created","comment":{"url":"https://api.github.com/repos/greenplum-db/gporca/pulls/comments/236877089","pull_request_review_id":179047074,"id":236877089,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNjg3NzA4OQ==","diff_hunk":"@@ -1,33 +1,30 @@\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n-<!--\n-     CREATE TABLE foo (a int, b int);\n-     CREATE TABLE bar (c int, d int);\n-\n-     EXPLAIN SELECT * FROM foo WHERE foo.a IN (SELECT foo.b FROM bar);\n--->\n <dxl:DXLMessage xmlns:dxl=\"http://greenplum.com/dxl/2010/12/\">\n+  <dxl:Comment><![CDATA[\n+     CREATE TABLE t1 (a int);\n+     CREATE TABLE t2 (b int);\n+     EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT a FROM t2);","path":"data/dxl/minidump/CorrelatedIN-LeftSemiJoin-True.mdp","position":16,"original_position":12,"commit_id":"2abaf5978ca0957d116e4941fff554f640cd20d8","original_commit_id":"6a5769bba940ca61f52ac3fd53e277f0ed2111a3","user":{"login":"asubramanya","id":12837610,"node_id":"MDQ6VXNlcjEyODM3NjEw","avatar_url":"https://avatars1.githubusercontent.com/u/12837610?v=4","gravatar_id":"","url":"https://api.github.com/users/asubramanya","html_url":"https://github.com/asubramanya","followers_url":"https://api.github.com/users/asubramanya/followers","following_url":"https://api.github.com/users/asubramanya/following{/other_user}","gists_url":"https://api.github.com/users/asubramanya/gists{/gist_id}","starred_url":"https://api.github.com/users/asubramanya/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asubramanya/subscriptions","organizations_url":"https://api.github.com/users/asubramanya/orgs","repos_url":"https://api.github.com/users/asubramanya/repos","events_url":"https://api.github.com/users/asubramanya/events{/privacy}","received_events_url":"https://api.github.com/users/asubramanya/received_events","type":"User","site_admin":false},"body":"Added the insert statement and the plan","created_at":"2018-11-27T22:43:17Z","updated_at":"2018-11-27T22:43:17Z","html_url":"https://github.com/greenplum-db/gporca/pull/425#discussion_r236877089","pull_request_url":"https://api.github.com/repos/greenplum-db/gporca/pulls/425","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/comments/236877089"},"html":{"href":"https://github.com/greenplum-db/gporca/pull/425#discussion_r236877089"},"pull_request":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/425"}},"in_reply_to_id":236537590},"pull_request":{"url":"https://api.github.com/repos/greenplum-db/gporca/pulls/425","id":232386952,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMyMzg2OTUy","html_url":"https://github.com/greenplum-db/gporca/pull/425","diff_url":"https://github.com/greenplum-db/gporca/pull/425.diff","patch_url":"https://github.com/greenplum-db/gporca/pull/425.patch","issue_url":"https://api.github.com/repos/greenplum-db/gporca/issues/425","number":425,"state":"open","locked":false,"title":"Correlated subquery results in multiple rows","user":{"login":"iyerr3","id":2237447,"node_id":"MDQ6VXNlcjIyMzc0NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/2237447?v=4","gravatar_id":"","url":"https://api.github.com/users/iyerr3","html_url":"https://github.com/iyerr3","followers_url":"https://api.github.com/users/iyerr3/followers","following_url":"https://api.github.com/users/iyerr3/following{/other_user}","gists_url":"https://api.github.com/users/iyerr3/gists{/gist_id}","starred_url":"https://api.github.com/users/iyerr3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iyerr3/subscriptions","organizations_url":"https://api.github.com/users/iyerr3/orgs","repos_url":"https://api.github.com/users/iyerr3/repos","events_url":"https://api.github.com/users/iyerr3/events{/privacy}","received_events_url":"https://api.github.com/users/iyerr3/received_events","type":"User","site_admin":false},"body":"This PR solves the following issue: \r\n\r\n```sql\r\ncreate table foo(c1 int);\r\ncreate table bar(c2 int);\r\ninsert into foo values(1), (2);\r\ninsert into bar values(1), (2), (3), (4);\r\n\r\nselect * from bar where c2 in (select c2 from foo);\r\n```\r\nAbove query errors out when it should not\r\n```\r\n! ERROR:  more than one row returned by a subquery used as an expression\r\n```\r\n\r\nPlan before: \r\n```\r\nLOG:  00000: statement: explain select * from bar where c2 in (select c2 from foo);\r\nLOCATION:  exec_simple_query, postgres.c:1632\r\nLOG:  00000: 2018-11-20 08:22:04:785030 PST,THD000,TRACE,\"\r\nPhysical plan:\r\n+--CPhysicalMotionGather(master)   rows:1   width:68  rebinds:1   cost:1324032.137874   origin: [Grp:4, GrpExpr:21]\r\n   +--CPhysicalCorrelatedInLeftSemiNLJoin(\"c2\" (0))   rows:1   width:68  rebinds:1   cost:1324032.137850   origin: [Grp:4, GrpExpr:20]\r\n      |--CPhysicalFilter   rows:1   width:34  rebinds:1   cost:431.000073   origin: [Grp:8, GrpExpr:1]\r\n      |  |--CPhysicalTableScan \"bar\" (\"bar\")   rows:4   width:34  rebinds:1   cost:431.000025   origin: [Grp:0, GrpExpr:1]\r\n      |  +--CScalarCmp (=)   origin: [Grp:5, GrpExpr:0]\r\n      |     |--CScalarIdent \"c2\" (0)   origin: [Grp:2, GrpExpr:0]\r\n      |     +--CScalarIdent \"c2\" (0)   origin: [Grp:2, GrpExpr:0]\r\n      |--CPhysicalSpool (Streaming)   rows:2   width:34  rebinds:1   cost:431.000052   origin: [Grp:1, GrpExpr:3]\r\n      |  +--CPhysicalMotionBroadcast    rows:2   width:34  rebinds:1   cost:431.000050   origin: [Grp:1, GrpExpr:2]\r\n      |     +--CPhysicalTableScan \"foo\" (\"foo\")   rows:2   width:34  rebinds:1   cost:431.000012   origin: [Grp:1, GrpExpr:1]\r\n      +--CScalarConst (1)   origin: [Grp:7, GrpExpr:0]\r\n\",\r\nLOCATION:  LogExceptionMessageAndDelete, COptTasks.cpp:324\r\n                                                QUERY PLAN\r\n-----------------------------------------------------------------------------------------------------------\r\n Gather Motion 3:1  (slice2; segments: 3)  (cost=0.00..1324032.14 rows=2 width=4)\r\n   ->  Table Scan on bar  (cost=0.00..1324032.14 rows=1 width=4)\r\n         Filter: ((c2 = c2) AND (SubPlan 1))\r\n         SubPlan 1  (slice2; segments: 3)\r\n           ->  Result  (cost=0.00..431.00 rows=2 width=1)\r\n                 ->  Materialize  (cost=0.00..431.00 rows=2 width=1)\r\n                       ->  Broadcast Motion 3:3  (slice1; segments: 3)  (cost=0.00..431.00 rows=2 width=1)\r\n                             ->  Table Scan on foo  (cost=0.00..431.00 rows=1 width=1)\r\n Planning time: 418.887 ms\r\n Optimizer: PQO version 3.9.0\r\n```\r\n\r\nThe `(SubPlan 1)` is expected by Executor to return just a single tuple but the\r\nactual number of tuples depends on `CPhysicalTableScan \"foo\"`. This plan is\r\ncreated via `CLogialLeftSemiCorrelatedApplyIn` - there is a sister alternative\r\n(`CLogicalLeftSemiApplyIn`) that does not produce an error since a LIMIT is\r\nadded into the plan by `CXformLeftSemiJoin2CrossProduct` (which applies to\r\na child from `CLogicalLeftSemiApplyIn` but not on `CLogicalLeftSemiCorrelatedApplyIn`).\r\n\r\nPlan after: \r\n```\r\npostgres=# explain select * from bar where c2 in (select c2 from foo);\r\nLOG:  00000: statement: explain select * from bar where c2 in (select c2 from foo);\r\nLOCATION:  exec_simple_query, postgres.c:1632\r\nLOG:  00000: 2018-11-20 08:19:24:752273 PST,THD000,TRACE,\"\r\nPhysical plan:\r\n+--CPhysicalMotionGather(master)   rows:1   width:14  rebinds:1   cost:1324032.160061   origin: [Grp:6, GrpExpr:28]\r\n   +--CPhysicalLeftSemiNLJoin   rows:1   width:14  rebinds:1   cost:1324032.160037   origin: [Grp:6, GrpExpr:24]\r\n      |--CPhysicalFilter   rows:1   width:34  rebinds:1   cost:431.000073   origin: [Grp:7, GrpExpr:1]\r\n      |  |--CPhysicalTableScan \"bar\" (\"bar\")   rows:4   width:34  rebinds:1   cost:431.000025   origin: [Grp:0, GrpExpr:1]\r\n      |  +--CScalarCmp (=)   origin: [Grp:2, GrpExpr:0]\r\n      |     |--CScalarIdent \"c2\" (0)   origin: [Grp:1, GrpExpr:0]\r\n      |     +--CScalarIdent \"c2\" (0)   origin: [Grp:1, GrpExpr:0]\r\n      |--CPhysicalSpool (Streaming)   rows:1   width:34  rebinds:1   cost:431.000073   origin: [Grp:10, GrpExpr:5]\r\n      |  +--CPhysicalMotionBroadcast    rows:1   width:34  rebinds:1   cost:431.000072   origin: [Grp:10, GrpExpr:7]\r\n      |     +--CPhysicalLimit <empty> global   rows:1   width:34  rebinds:1   cost:431.000019   origin: [Grp:10, GrpExpr:2]\r\n      |        |--CPhysicalMotionGather(master)   rows:1   width:34  rebinds:1   cost:431.000018   origin: [Grp:31, GrpExpr:2]\r\n      |        |  +--CPhysicalLimit <empty> local   rows:1   width:34  rebinds:1   cost:431.000014   origin: [Grp:31, GrpExpr:1]\r\n      |        |     |--CPhysicalTableScan \"foo\" (\"foo\")   rows:2   width:34  rebinds:1   cost:431.000012   origin: [Grp:3, GrpExpr:1]\r\n      |        |     |--CScalarConst (0)   origin: [Grp:8, GrpExpr:0]\r\n      |        |     +--CScalarConst (1)   origin: [Grp:9, GrpExpr:0]\r\n      |        |--CScalarConst (0)   origin: [Grp:8, GrpExpr:0]\r\n      |        +--CScalarConst (1)   origin: [Grp:9, GrpExpr:0]\r\n      +--CScalarConst (1)   origin: [Grp:11, GrpExpr:0]\r\n\",\r\nLOCATION:  LogExceptionMessageAndDelete, COptTasks.cpp:324\r\n                                                 QUERY PLAN\r\n------------------------------------------------------------------------------------------------------------\r\n Gather Motion 3:1  (slice3; segments: 3)  (cost=0.00..1324032.16 rows=2 width=4)\r\n   ->  Nested Loop Semi Join  (cost=0.00..1324032.16 rows=1 width=4)\r\n         Join Filter: true\r\n         ->  Table Scan on bar  (cost=0.00..431.00 rows=1 width=4)\r\n               Filter: (c2 = c2)\r\n         ->  Materialize  (cost=0.00..431.00 rows=1 width=1)\r\n               ->  Broadcast Motion 1:3  (slice2)  (cost=0.00..431.00 rows=3 width=1)\r\n                     ->  Limit  (cost=0.00..431.00 rows=1 width=1)\r\n                           ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..431.00 rows=1 width=1)\r\n                                 ->  Limit  (cost=0.00..431.00 rows=1 width=1)\r\n                                       ->  Table Scan on foo  (cost=0.00..431.00 rows=1 width=1)\r\n Planning time: 439.293 ms\r\n Optimizer: PQO version 3.9.0\r\n ```\r\n\r\nThe primary fix is in the `PexprExistWithPredFromINSubq` function in\r\n`CExpressionPreprocessor` where an IN subquery, like the one above, is converted\r\nto an EXISTS subquery. Previously this conversion was restricted to only\r\n`LogicalProject` operations (which did not happen in our case since the projected \r\ncolumn is a column reference).\r\n\r\nThere is an additional temporary fix that ensures the erroneous plan does not occur \r\nagain. We add a LIMIT in the case of`CLogicalLeftSemiCorrelatedApplyIn` when \r\nthere are no outer references. This \"fix\" would need to re-visited since the ideal \r\nchange is not produce 'Correlated' operators when there is no correlation.\r\n\r\nThe PR is structured into 3 commits: \r\n1. Preprocessor fixes\r\n2. Limit added to Correlated Apply \r\n3. MDP updates\r\nAny additional updates/refinements will be squashed back to appropriate commit. ","created_at":"2018-11-20T16:44:47Z","updated_at":"2018-11-27T22:43:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b025610f4d484f2dd92b91eef1aff9a547e32037","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/greenplum-db/gporca/pulls/425/commits","review_comments_url":"https://api.github.com/repos/greenplum-db/gporca/pulls/425/comments","review_comment_url":"https://api.github.com/repos/greenplum-db/gporca/pulls/comments{/number}","comments_url":"https://api.github.com/repos/greenplum-db/gporca/issues/425/comments","statuses_url":"https://api.github.com/repos/greenplum-db/gporca/statuses/2abaf5978ca0957d116e4941fff554f640cd20d8","head":{"label":"iyerr3:correlated_subquery_multiple_rows","ref":"correlated_subquery_multiple_rows","sha":"2abaf5978ca0957d116e4941fff554f640cd20d8","user":{"login":"iyerr3","id":2237447,"node_id":"MDQ6VXNlcjIyMzc0NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/2237447?v=4","gravatar_id":"","url":"https://api.github.com/users/iyerr3","html_url":"https://github.com/iyerr3","followers_url":"https://api.github.com/users/iyerr3/followers","following_url":"https://api.github.com/users/iyerr3/following{/other_user}","gists_url":"https://api.github.com/users/iyerr3/gists{/gist_id}","starred_url":"https://api.github.com/users/iyerr3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iyerr3/subscriptions","organizations_url":"https://api.github.com/users/iyerr3/orgs","repos_url":"https://api.github.com/users/iyerr3/repos","events_url":"https://api.github.com/users/iyerr3/events{/privacy}","received_events_url":"https://api.github.com/users/iyerr3/received_events","type":"User","site_admin":false},"repo":{"id":152320924,"node_id":"MDEwOlJlcG9zaXRvcnkxNTIzMjA5MjQ=","name":"gporca","full_name":"iyerr3/gporca","private":false,"owner":{"login":"iyerr3","id":2237447,"node_id":"MDQ6VXNlcjIyMzc0NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/2237447?v=4","gravatar_id":"","url":"https://api.github.com/users/iyerr3","html_url":"https://github.com/iyerr3","followers_url":"https://api.github.com/users/iyerr3/followers","following_url":"https://api.github.com/users/iyerr3/following{/other_user}","gists_url":"https://api.github.com/users/iyerr3/gists{/gist_id}","starred_url":"https://api.github.com/users/iyerr3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iyerr3/subscriptions","organizations_url":"https://api.github.com/users/iyerr3/orgs","repos_url":"https://api.github.com/users/iyerr3/repos","events_url":"https://api.github.com/users/iyerr3/events{/privacy}","received_events_url":"https://api.github.com/users/iyerr3/received_events","type":"User","site_admin":false},"html_url":"https://github.com/iyerr3/gporca","description":"A modular query optimizer for big data","fork":true,"url":"https://api.github.com/repos/iyerr3/gporca","forks_url":"https://api.github.com/repos/iyerr3/gporca/forks","keys_url":"https://api.github.com/repos/iyerr3/gporca/keys{/key_id}","collaborators_url":"https://api.github.com/repos/iyerr3/gporca/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/iyerr3/gporca/teams","hooks_url":"https://api.github.com/repos/iyerr3/gporca/hooks","issue_events_url":"https://api.github.com/repos/iyerr3/gporca/issues/events{/number}","events_url":"https://api.github.com/repos/iyerr3/gporca/events","assignees_url":"https://api.github.com/repos/iyerr3/gporca/assignees{/user}","branches_url":"https://api.github.com/repos/iyerr3/gporca/branches{/branch}","tags_url":"https://api.github.com/repos/iyerr3/gporca/tags","blobs_url":"https://api.github.com/repos/iyerr3/gporca/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/iyerr3/gporca/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/iyerr3/gporca/git/refs{/sha}","trees_url":"https://api.github.com/repos/iyerr3/gporca/git/trees{/sha}","statuses_url":"https://api.github.com/repos/iyerr3/gporca/statuses/{sha}","languages_url":"https://api.github.com/repos/iyerr3/gporca/languages","stargazers_url":"https://api.github.com/repos/iyerr3/gporca/stargazers","contributors_url":"https://api.github.com/repos/iyerr3/gporca/contributors","subscribers_url":"https://api.github.com/repos/iyerr3/gporca/subscribers","subscription_url":"https://api.github.com/repos/iyerr3/gporca/subscription","commits_url":"https://api.github.com/repos/iyerr3/gporca/commits{/sha}","git_commits_url":"https://api.github.com/repos/iyerr3/gporca/git/commits{/sha}","comments_url":"https://api.github.com/repos/iyerr3/gporca/comments{/number}","issue_comment_url":"https://api.github.com/repos/iyerr3/gporca/issues/comments{/number}","contents_url":"https://api.github.com/repos/iyerr3/gporca/contents/{+path}","compare_url":"https://api.github.com/repos/iyerr3/gporca/compare/{base}...{head}","merges_url":"https://api.github.com/repos/iyerr3/gporca/merges","archive_url":"https://api.github.com/repos/iyerr3/gporca/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/iyerr3/gporca/downloads","issues_url":"https://api.github.com/repos/iyerr3/gporca/issues{/number}","pulls_url":"https://api.github.com/repos/iyerr3/gporca/pulls{/number}","milestones_url":"https://api.github.com/repos/iyerr3/gporca/milestones{/number}","notifications_url":"https://api.github.com/repos/iyerr3/gporca/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/iyerr3/gporca/labels{/name}","releases_url":"https://api.github.com/repos/iyerr3/gporca/releases{/id}","deployments_url":"https://api.github.com/repos/iyerr3/gporca/deployments","created_at":"2018-10-09T21:02:44Z","updated_at":"2018-10-09T21:02:59Z","pushed_at":"2018-11-27T22:40:45Z","git_url":"git://github.com/iyerr3/gporca.git","ssh_url":"git@github.com:iyerr3/gporca.git","clone_url":"https://github.com/iyerr3/gporca.git","svn_url":"https://github.com/iyerr3/gporca","homepage":"","size":44028,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"greenplum-db:master","ref":"master","sha":"fdccc774db345a0bd38b7bec6f7fb7965ba298a2","user":{"login":"greenplum-db","id":14097842,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MDk3ODQy","avatar_url":"https://avatars2.githubusercontent.com/u/14097842?v=4","gravatar_id":"","url":"https://api.github.com/users/greenplum-db","html_url":"https://github.com/greenplum-db","followers_url":"https://api.github.com/users/greenplum-db/followers","following_url":"https://api.github.com/users/greenplum-db/following{/other_user}","gists_url":"https://api.github.com/users/greenplum-db/gists{/gist_id}","starred_url":"https://api.github.com/users/greenplum-db/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/greenplum-db/subscriptions","organizations_url":"https://api.github.com/users/greenplum-db/orgs","repos_url":"https://api.github.com/users/greenplum-db/repos","events_url":"https://api.github.com/users/greenplum-db/events{/privacy}","received_events_url":"https://api.github.com/users/greenplum-db/received_events","type":"Organization","site_admin":false},"repo":{"id":47849203,"node_id":"MDEwOlJlcG9zaXRvcnk0Nzg0OTIwMw==","name":"gporca","full_name":"greenplum-db/gporca","private":false,"owner":{"login":"greenplum-db","id":14097842,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MDk3ODQy","avatar_url":"https://avatars2.githubusercontent.com/u/14097842?v=4","gravatar_id":"","url":"https://api.github.com/users/greenplum-db","html_url":"https://github.com/greenplum-db","followers_url":"https://api.github.com/users/greenplum-db/followers","following_url":"https://api.github.com/users/greenplum-db/following{/other_user}","gists_url":"https://api.github.com/users/greenplum-db/gists{/gist_id}","starred_url":"https://api.github.com/users/greenplum-db/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/greenplum-db/subscriptions","organizations_url":"https://api.github.com/users/greenplum-db/orgs","repos_url":"https://api.github.com/users/greenplum-db/repos","events_url":"https://api.github.com/users/greenplum-db/events{/privacy}","received_events_url":"https://api.github.com/users/greenplum-db/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/greenplum-db/gporca","description":"A modular query optimizer for big data","fork":false,"url":"https://api.github.com/repos/greenplum-db/gporca","forks_url":"https://api.github.com/repos/greenplum-db/gporca/forks","keys_url":"https://api.github.com/repos/greenplum-db/gporca/keys{/key_id}","collaborators_url":"https://api.github.com/repos/greenplum-db/gporca/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/greenplum-db/gporca/teams","hooks_url":"https://api.github.com/repos/greenplum-db/gporca/hooks","issue_events_url":"https://api.github.com/repos/greenplum-db/gporca/issues/events{/number}","events_url":"https://api.github.com/repos/greenplum-db/gporca/events","assignees_url":"https://api.github.com/repos/greenplum-db/gporca/assignees{/user}","branches_url":"https://api.github.com/repos/greenplum-db/gporca/branches{/branch}","tags_url":"https://api.github.com/repos/greenplum-db/gporca/tags","blobs_url":"https://api.github.com/repos/greenplum-db/gporca/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/greenplum-db/gporca/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/greenplum-db/gporca/git/refs{/sha}","trees_url":"https://api.github.com/repos/greenplum-db/gporca/git/trees{/sha}","statuses_url":"https://api.github.com/repos/greenplum-db/gporca/statuses/{sha}","languages_url":"https://api.github.com/repos/greenplum-db/gporca/languages","stargazers_url":"https://api.github.com/repos/greenplum-db/gporca/stargazers","contributors_url":"https://api.github.com/repos/greenplum-db/gporca/contributors","subscribers_url":"https://api.github.com/repos/greenplum-db/gporca/subscribers","subscription_url":"https://api.github.com/repos/greenplum-db/gporca/subscription","commits_url":"https://api.github.com/repos/greenplum-db/gporca/commits{/sha}","git_commits_url":"https://api.github.com/repos/greenplum-db/gporca/git/commits{/sha}","comments_url":"https://api.github.com/repos/greenplum-db/gporca/comments{/number}","issue_comment_url":"https://api.github.com/repos/greenplum-db/gporca/issues/comments{/number}","contents_url":"https://api.github.com/repos/greenplum-db/gporca/contents/{+path}","compare_url":"https://api.github.com/repos/greenplum-db/gporca/compare/{base}...{head}","merges_url":"https://api.github.com/repos/greenplum-db/gporca/merges","archive_url":"https://api.github.com/repos/greenplum-db/gporca/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/greenplum-db/gporca/downloads","issues_url":"https://api.github.com/repos/greenplum-db/gporca/issues{/number}","pulls_url":"https://api.github.com/repos/greenplum-db/gporca/pulls{/number}","milestones_url":"https://api.github.com/repos/greenplum-db/gporca/milestones{/number}","notifications_url":"https://api.github.com/repos/greenplum-db/gporca/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/greenplum-db/gporca/labels{/name}","releases_url":"https://api.github.com/repos/greenplum-db/gporca/releases{/id}","deployments_url":"https://api.github.com/repos/greenplum-db/gporca/deployments","created_at":"2015-12-11T20:24:47Z","updated_at":"2018-11-27T18:50:55Z","pushed_at":"2018-11-27T22:40:47Z","git_url":"git://github.com/greenplum-db/gporca.git","ssh_url":"git@github.com:greenplum-db/gporca.git","clone_url":"https://github.com/greenplum-db/gporca.git","svn_url":"https://github.com/greenplum-db/gporca","homepage":"","size":44367,"stargazers_count":166,"watchers_count":166,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":95,"mirror_url":null,"archived":false,"open_issues_count":26,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":95,"open_issues":26,"watchers":166,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/425"},"html":{"href":"https://github.com/greenplum-db/gporca/pull/425"},"issue":{"href":"https://api.github.com/repos/greenplum-db/gporca/issues/425"},"comments":{"href":"https://api.github.com/repos/greenplum-db/gporca/issues/425/comments"},"review_comments":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/425/comments"},"review_comment":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/greenplum-db/gporca/pulls/425/commits"},"statuses":{"href":"https://api.github.com/repos/greenplum-db/gporca/statuses/2abaf5978ca0957d116e4941fff554f640cd20d8"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"asubramanya"}}