{"action":"created","comment":{"url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/comments/182195504","pull_request_review_id":112954530,"id":182195504,"diff_hunk":"@@ -0,0 +1,320 @@\n+// Copyright 2018 The Cockroach Authors.\n+//\n+// Licensed as a CockroachDB Enterprise file under the Cockroach Community\n+// License (the \"License\"); you may not use this file except in compliance with\n+// the License. You may obtain a copy of the License at\n+//\n+//     https://github.com/cockroachdb/cockroach/blob/master/licenses/CCL.txt\n+\n+package importccl\n+\n+import (\n+\t\"bytes\"\n+\t\"context\"\n+\t\"encoding/csv\"\n+\t\"fmt\"\n+\t\"strconv\"\n+\t\"strings\"\n+\t\"sync\"\n+\n+\t\"github.com/cockroachdb/cockroach/pkg/ccl/storageccl\"\n+\t\"github.com/cockroachdb/cockroach/pkg/internal/client\"\n+\t\"github.com/cockroachdb/cockroach/pkg/settings/cluster\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql/distsqlrun\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql/jobs\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql/sem/tree\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql/sem/types\"\n+\t\"github.com/cockroachdb/cockroach/pkg/sql/sqlbase\"\n+\t\"github.com/cockroachdb/cockroach/pkg/util/tracing\"\n+\t\"github.com/pkg/errors\"\n+)\n+\n+// exportHeader is the header for EXPORT stmt results.\n+var exportHeader = sqlbase.ResultColumns{\n+\t{Name: \"filename\", Typ: types.String},\n+\t{Name: \"rows\", Typ: types.Int},\n+\t{Name: \"bytes\", Typ: types.Int},\n+}\n+\n+const (\n+\texportOptionDelimiter = \"delimiter\"\n+\texportOptionChunkSize = \"chunk\"\n+\texportOptionFileName  = \"filename\"\n+)\n+\n+var exportOptionExpectValues = map[string]bool{\n+\texportOptionDelimiter: true,\n+\texportOptionChunkSize: true,\n+\texportOptionFileName:  true,\n+}\n+\n+const exportFilePatternPart = \"%part%\"\n+const exportFilePatternDefault = exportFilePatternPart + \".csv\"\n+\n+// exportPlanHook implements sql.PlanHook.\n+func exportPlanHook(\n+\tctx context.Context, stmt tree.Statement, p sql.PlanHookState,\n+) (sql.PlanHookRowFn, sqlbase.ResultColumns, []sql.PlanNode, error) {\n+\texportStmt, ok := stmt.(*tree.Export)\n+\tif !ok {\n+\t\treturn nil, nil, nil, nil\n+\t}\n+\n+\tfileFn, err := p.TypeAsString(exportStmt.File, \"EXPORT\")\n+\tif err != nil {\n+\t\treturn nil, nil, nil, err\n+\t}\n+\n+\tif exportStmt.FileFormat != \"CSV\" {\n+\t\t// not possible with current parser rules.\n+\t\treturn nil, nil, nil, errors.Errorf(\"unsupported import format: %q\", exportStmt.FileFormat)\n+\t}\n+\n+\toptsFn, err := p.TypeAsStringOpts(exportStmt.Options, exportOptionExpectValues)\n+\tif err != nil {\n+\t\treturn nil, nil, nil, err\n+\t}\n+\n+\tsel, err := p.Select(ctx, exportStmt.Query, nil)\n+\tif err != nil {\n+\t\treturn nil, nil, nil, err\n+\t}\n+\n+\tif !p.DistSQLPlanner().CheckPossible(sel) {\n+\t\treturn nil, nil, nil, errors.Errorf(\"unsupported EXPORT query -- as an alternative try `cockroach sql --format=csv`\")\n+\t}\n+\n+\tfn := func(ctx context.Context, plans []sql.PlanNode, resultsCh chan<- tree.Datums) error {\n+\t\tctx, span := tracing.ChildSpan(ctx, exportStmt.StatementTag())\n+\t\tdefer tracing.FinishSpan(span)\n+\n+\t\tif err := p.RequireSuperUser(ctx, \"EXPORT\"); err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tif !p.ExtendedEvalContext().TxnImplicit {\n+\t\t\treturn errors.Errorf(\"EXPORT cannot be used inside a transaction\")\n+\t\t}\n+\n+\t\tfile, err := fileFn()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\topts, err := optsFn()\n+\t\tif err != nil {\n+\t\t\treturn err\n+\t\t}\n+\n+\t\tdelim := ','\n+\t\tif override, ok := opts[exportOptionDelimiter]; ok {\n+\t\t\tif len(override) > 1 {\n+\t\t\t\treturn errors.Errorf(\"TODO\")\n+\t\t\t}\n+\t\t\tdelim = []rune(override)[0]\n+\t\t}\n+\n+\t\tchunk := 0\n+\t\tif override, ok := opts[exportOptionChunkSize]; ok {\n+\t\t\tchunk, err = strconv.Atoi(override)\n+\t\t\tif err != nil {\n+\t\t\t\treturn err\n+\t\t\t}\n+\t\t}\n+\n+\t\tfilename := exportFilePatternDefault\n+\t\tif override, ok := opts[exportOptionChunkSize]; ok {\n+\t\t\tfilename = override\n+\t\t}\n+\t\tif strings.Count(filename, exportFilePatternPart) != 1 {\n+\t\t\treturn errors.Errorf(\"EXPORT filename pattern does must contain one instance of %q\", exportFilePatternPart)\n+\t\t}\n+\n+\t\tout := distsqlrun.ProcessorCoreUnion{CSVWriter: &distsqlrun.CSVWriterSpec{\n+\t\t\tDestination: file,\n+\t\t\tNamePattern: filename,\n+\t\t\tDelimiter:   delim,\n+\t\t\tChunkRows:   int64(chunk),\n+\t\t}}\n+\n+\t\trows := sqlbase.NewRowContainer(\n+\t\t\tp.ExtendedEvalContext().Mon.MakeBoundAccount(), sqlbase.ColTypeInfoFromColTypes(sql.ExportPlanResultTypes), 0,\n+\t\t)\n+\t\trw := sql.NewRowResultWriter(rows)\n+\n+\t\tif err := p.DistSQLPlanner().PlanAndRunExport(\n+\t\t\tctx, p.Txn(), p.ExtendedEvalContext(), plans[0], out, rw,\n+\t\t); err != nil {\n+\t\t\treturn err\n+\t\t}\n+\t\tfor i := 0; i < rows.Len(); i++ {\n+\t\t\tresultsCh <- rows.At(i)\n+\t\t}\n+\t\trows.Close(ctx)\n+\t\treturn rw.Err()\n+\t}\n+\n+\treturn fn, exportHeader, []sql.PlanNode{sel}, nil\n+}\n+\n+func newCSVWriterProcessor(\n+\tflowCtx *distsqlrun.FlowCtx,\n+\tspec distsqlrun.CSVWriterSpec,\n+\tinput distsqlrun.RowSource,\n+\toutput distsqlrun.RowReceiver,\n+) (distsqlrun.Processor, error) {\n+\tc := &csvWriter{\n+\t\tflowCtx:  flowCtx,\n+\t\tspec:     spec,\n+\t\tinput:    input,\n+\t\toutput:   output,\n+\t\tsettings: flowCtx.Settings,\n+\t\tregistry: flowCtx.JobRegistry,\n+\t\tprogress: spec.Progress,\n+\t\tdb:       flowCtx.EvalCtx.Txn.DB(),\n+\t}\n+\tif err := c.out.Init(&distsqlrun.PostProcessSpec{}, sql.ExportPlanResultTypes, flowCtx.NewEvalCtx(), output); err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn c, nil\n+}\n+\n+type csvWriter struct {\n+\tflowCtx  *distsqlrun.FlowCtx\n+\tspec     distsqlrun.CSVWriterSpec\n+\tinput    distsqlrun.RowSource\n+\tout      distsqlrun.ProcOutputHelper\n+\toutput   distsqlrun.RowReceiver\n+\tsettings *cluster.Settings\n+\tregistry *jobs.Registry\n+\tprogress distsqlrun.JobProgress\n+\tdb       *client.DB\n+}\n+\n+var _ distsqlrun.Processor = &csvWriter{}\n+\n+func (sp *csvWriter) OutputTypes() []sqlbase.ColumnType {\n+\treturn sql.ExportPlanResultTypes\n+}\n+\n+func (sp *csvWriter) Run(ctx context.Context, wg *sync.WaitGroup) {\n+\tctx, span := tracing.ChildSpan(ctx, \"csvWriter\")\n+\tdefer tracing.FinishSpan(span)\n+\n+\tif wg != nil {\n+\t\tdefer wg.Done()\n+\t}\n+\n+\terr := func() error {\n+\t\tpattern := exportFilePatternDefault\n+\t\tif sp.spec.NamePattern != \"\" {\n+\t\t\tpattern = sp.spec.NamePattern\n+\t\t}\n+\n+\t\ttypes := sp.input.OutputTypes()\n+\t\tsp.input.Start(ctx)\n+\t\tinput := distsqlrun.MakeNoMetadataRowSource(sp.input, sp.output)\n+\n+\t\talloc := &sqlbase.DatumAlloc{}\n+\n+\t\tvar buf bytes.Buffer\n+\t\twriter := csv.NewWriter(&buf)\n+\t\tif sp.spec.Delimiter != 0 {\n+\t\t\twriter.Comma = sp.spec.Delimiter\n+\t\t}\n+\n+\t\tf := tree.NewFmtCtxWithBuf(tree.FmtParsable)\n+\t\tdefer f.Close()\n+\n+\t\tcsvRow := make([]string, len(types))\n+\n+\t\tchunk := 0\n+\t\tdone := false\n+\t\tvar rows int64\n+\t\tfor {\n+\t\t\tbuf.Reset()\n+\t\t\tfor {\n+\t\t\t\tif sp.spec.ChunkRows > 0 && rows >= sp.spec.ChunkRows {","path":"pkg/ccl/importccl/exportcsv.go","position":238,"original_position":238,"commit_id":"e95b2609db7e888f5e71587b755a9e014a3ddf12","original_commit_id":"e95b2609db7e888f5e71587b755a9e014a3ddf12","user":{"login":"mjibson","id":41181,"avatar_url":"https://avatars1.githubusercontent.com/u/41181?v=4","gravatar_id":"","url":"https://api.github.com/users/mjibson","html_url":"https://github.com/mjibson","followers_url":"https://api.github.com/users/mjibson/followers","following_url":"https://api.github.com/users/mjibson/following{/other_user}","gists_url":"https://api.github.com/users/mjibson/gists{/gist_id}","starred_url":"https://api.github.com/users/mjibson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mjibson/subscriptions","organizations_url":"https://api.github.com/users/mjibson/orgs","repos_url":"https://api.github.com/users/mjibson/repos","events_url":"https://api.github.com/users/mjibson/events{/privacy}","received_events_url":"https://api.github.com/users/mjibson/received_events","type":"User","site_admin":false},"body":"I was thinking buf.Len so we care about bytes more than row count. But whatever.","created_at":"2018-04-17T19:15:16Z","updated_at":"2018-04-17T19:15:16Z","html_url":"https://github.com/cockroachdb/cockroach/pull/24755#discussion_r182195504","pull_request_url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/comments/182195504"},"html":{"href":"https://github.com/cockroachdb/cockroach/pull/24755#discussion_r182195504"},"pull_request":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755"}},"in_reply_to_id":181987393},"pull_request":{"url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755","id":181323015,"html_url":"https://github.com/cockroachdb/cockroach/pull/24755","diff_url":"https://github.com/cockroachdb/cockroach/pull/24755.diff","patch_url":"https://github.com/cockroachdb/cockroach/pull/24755.patch","issue_url":"https://api.github.com/repos/cockroachdb/cockroach/issues/24755","number":24755,"state":"open","locked":false,"title":"importccl: implement EXPORT csv","user":{"login":"dt","id":15615,"avatar_url":"https://avatars2.githubusercontent.com/u/15615?v=4","gravatar_id":"","url":"https://api.github.com/users/dt","html_url":"https://github.com/dt","followers_url":"https://api.github.com/users/dt/followers","following_url":"https://api.github.com/users/dt/following{/other_user}","gists_url":"https://api.github.com/users/dt/gists{/gist_id}","starred_url":"https://api.github.com/users/dt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dt/subscriptions","organizations_url":"https://api.github.com/users/dt/orgs","repos_url":"https://api.github.com/users/dt/repos","events_url":"https://api.github.com/users/dt/events{/privacy}","received_events_url":"https://api.github.com/users/dt/received_events","type":"User","site_admin":false},"body":" This adds a DistSQL processor that writes whatever it is given as CSV files to a specified storage location.\r\n\r\nThis processor can be appended as a sink for arbitrary SELECT queries.\r\n\r\nThe primary intended use-case is dumping tables as CSV for bulk-export, but it can also be used on any SELECT query, so it could also be used in report generation or other workflows.\r\n\r\nRelease note (enterprise change): prototype support for EXPORT CSV.","created_at":"2018-04-12T20:54:52Z","updated_at":"2018-04-17T19:15:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e9e868bc9424811fd0a2c3db34712e8593cc3824","assignee":null,"assignees":[],"requested_reviewers":[{"login":"danhhz","id":52528,"avatar_url":"https://avatars1.githubusercontent.com/u/52528?v=4","gravatar_id":"","url":"https://api.github.com/users/danhhz","html_url":"https://github.com/danhhz","followers_url":"https://api.github.com/users/danhhz/followers","following_url":"https://api.github.com/users/danhhz/following{/other_user}","gists_url":"https://api.github.com/users/danhhz/gists{/gist_id}","starred_url":"https://api.github.com/users/danhhz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danhhz/subscriptions","organizations_url":"https://api.github.com/users/danhhz/orgs","repos_url":"https://api.github.com/users/danhhz/repos","events_url":"https://api.github.com/users/danhhz/events{/privacy}","received_events_url":"https://api.github.com/users/danhhz/received_events","type":"User","site_admin":false},{"login":"arjunravinarayan","id":1565833,"avatar_url":"https://avatars0.githubusercontent.com/u/1565833?v=4","gravatar_id":"","url":"https://api.github.com/users/arjunravinarayan","html_url":"https://github.com/arjunravinarayan","followers_url":"https://api.github.com/users/arjunravinarayan/followers","following_url":"https://api.github.com/users/arjunravinarayan/following{/other_user}","gists_url":"https://api.github.com/users/arjunravinarayan/gists{/gist_id}","starred_url":"https://api.github.com/users/arjunravinarayan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arjunravinarayan/subscriptions","organizations_url":"https://api.github.com/users/arjunravinarayan/orgs","repos_url":"https://api.github.com/users/arjunravinarayan/repos","events_url":"https://api.github.com/users/arjunravinarayan/events{/privacy}","received_events_url":"https://api.github.com/users/arjunravinarayan/received_events","type":"User","site_admin":false}],"requested_teams":[{"name":"sql-execution-prs","id":2437984,"slug":"sql-execution-prs","description":"Join this team for notifications about SQL execution PRs","privacy":"closed","url":"https://api.github.com/teams/2437984","members_url":"https://api.github.com/teams/2437984/members{/member}","repositories_url":"https://api.github.com/teams/2437984/repos","permission":"pull"},{"name":"sql-planning-prs","id":2437986,"slug":"sql-planning-prs","description":"Join this team for notifications about SQL planning PRs","privacy":"closed","url":"https://api.github.com/teams/2437986","members_url":"https://api.github.com/teams/2437986/members{/member}","repositories_url":"https://api.github.com/teams/2437986/repos","permission":"pull"},{"name":"distsql-prs","id":2437988,"slug":"distsql-prs","description":"Join this team for notifications about DistSQL PRs","privacy":"closed","url":"https://api.github.com/teams/2437988","members_url":"https://api.github.com/teams/2437988/members{/member}","repositories_url":"https://api.github.com/teams/2437988/repos","permission":"pull"}],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755/commits","review_comments_url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755/comments","review_comment_url":"https://api.github.com/repos/cockroachdb/cockroach/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cockroachdb/cockroach/issues/24755/comments","statuses_url":"https://api.github.com/repos/cockroachdb/cockroach/statuses/e95b2609db7e888f5e71587b755a9e014a3ddf12","head":{"label":"dt:export","ref":"export","sha":"e95b2609db7e888f5e71587b755a9e014a3ddf12","user":{"login":"dt","id":15615,"avatar_url":"https://avatars2.githubusercontent.com/u/15615?v=4","gravatar_id":"","url":"https://api.github.com/users/dt","html_url":"https://github.com/dt","followers_url":"https://api.github.com/users/dt/followers","following_url":"https://api.github.com/users/dt/following{/other_user}","gists_url":"https://api.github.com/users/dt/gists{/gist_id}","starred_url":"https://api.github.com/users/dt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dt/subscriptions","organizations_url":"https://api.github.com/users/dt/orgs","repos_url":"https://api.github.com/users/dt/repos","events_url":"https://api.github.com/users/dt/events{/privacy}","received_events_url":"https://api.github.com/users/dt/received_events","type":"User","site_admin":false},"repo":{"id":48062626,"name":"cockroach","full_name":"dt/cockroach","owner":{"login":"dt","id":15615,"avatar_url":"https://avatars2.githubusercontent.com/u/15615?v=4","gravatar_id":"","url":"https://api.github.com/users/dt","html_url":"https://github.com/dt","followers_url":"https://api.github.com/users/dt/followers","following_url":"https://api.github.com/users/dt/following{/other_user}","gists_url":"https://api.github.com/users/dt/gists{/gist_id}","starred_url":"https://api.github.com/users/dt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dt/subscriptions","organizations_url":"https://api.github.com/users/dt/orgs","repos_url":"https://api.github.com/users/dt/repos","events_url":"https://api.github.com/users/dt/events{/privacy}","received_events_url":"https://api.github.com/users/dt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dt/cockroach","description":"A Scalable, Survivable, Strongly-Consistent SQL Database","fork":true,"url":"https://api.github.com/repos/dt/cockroach","forks_url":"https://api.github.com/repos/dt/cockroach/forks","keys_url":"https://api.github.com/repos/dt/cockroach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dt/cockroach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dt/cockroach/teams","hooks_url":"https://api.github.com/repos/dt/cockroach/hooks","issue_events_url":"https://api.github.com/repos/dt/cockroach/issues/events{/number}","events_url":"https://api.github.com/repos/dt/cockroach/events","assignees_url":"https://api.github.com/repos/dt/cockroach/assignees{/user}","branches_url":"https://api.github.com/repos/dt/cockroach/branches{/branch}","tags_url":"https://api.github.com/repos/dt/cockroach/tags","blobs_url":"https://api.github.com/repos/dt/cockroach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dt/cockroach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dt/cockroach/git/refs{/sha}","trees_url":"https://api.github.com/repos/dt/cockroach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dt/cockroach/statuses/{sha}","languages_url":"https://api.github.com/repos/dt/cockroach/languages","stargazers_url":"https://api.github.com/repos/dt/cockroach/stargazers","contributors_url":"https://api.github.com/repos/dt/cockroach/contributors","subscribers_url":"https://api.github.com/repos/dt/cockroach/subscribers","subscription_url":"https://api.github.com/repos/dt/cockroach/subscription","commits_url":"https://api.github.com/repos/dt/cockroach/commits{/sha}","git_commits_url":"https://api.github.com/repos/dt/cockroach/git/commits{/sha}","comments_url":"https://api.github.com/repos/dt/cockroach/comments{/number}","issue_comment_url":"https://api.github.com/repos/dt/cockroach/issues/comments{/number}","contents_url":"https://api.github.com/repos/dt/cockroach/contents/{+path}","compare_url":"https://api.github.com/repos/dt/cockroach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dt/cockroach/merges","archive_url":"https://api.github.com/repos/dt/cockroach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dt/cockroach/downloads","issues_url":"https://api.github.com/repos/dt/cockroach/issues{/number}","pulls_url":"https://api.github.com/repos/dt/cockroach/pulls{/number}","milestones_url":"https://api.github.com/repos/dt/cockroach/milestones{/number}","notifications_url":"https://api.github.com/repos/dt/cockroach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dt/cockroach/labels{/name}","releases_url":"https://api.github.com/repos/dt/cockroach/releases{/id}","deployments_url":"https://api.github.com/repos/dt/cockroach/deployments","created_at":"2015-12-15T18:54:23Z","updated_at":"2016-01-11T21:30:06Z","pushed_at":"2018-04-16T19:05:54Z","git_url":"git://github.com/dt/cockroach.git","ssh_url":"git@github.com:dt/cockroach.git","clone_url":"https://github.com/dt/cockroach.git","svn_url":"https://github.com/dt/cockroach","homepage":"http://www.cockroachlabs.com","size":505011,"stargazers_count":0,"watchers_count":0,"language":"Go","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":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"cockroachdb:master","ref":"master","sha":"96295ac25279f02474e67895a8f5b6e60c09dee0","user":{"login":"cockroachdb","id":6748139,"avatar_url":"https://avatars3.githubusercontent.com/u/6748139?v=4","gravatar_id":"","url":"https://api.github.com/users/cockroachdb","html_url":"https://github.com/cockroachdb","followers_url":"https://api.github.com/users/cockroachdb/followers","following_url":"https://api.github.com/users/cockroachdb/following{/other_user}","gists_url":"https://api.github.com/users/cockroachdb/gists{/gist_id}","starred_url":"https://api.github.com/users/cockroachdb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cockroachdb/subscriptions","organizations_url":"https://api.github.com/users/cockroachdb/orgs","repos_url":"https://api.github.com/users/cockroachdb/repos","events_url":"https://api.github.com/users/cockroachdb/events{/privacy}","received_events_url":"https://api.github.com/users/cockroachdb/received_events","type":"Organization","site_admin":false},"repo":{"id":16563587,"name":"cockroach","full_name":"cockroachdb/cockroach","owner":{"login":"cockroachdb","id":6748139,"avatar_url":"https://avatars3.githubusercontent.com/u/6748139?v=4","gravatar_id":"","url":"https://api.github.com/users/cockroachdb","html_url":"https://github.com/cockroachdb","followers_url":"https://api.github.com/users/cockroachdb/followers","following_url":"https://api.github.com/users/cockroachdb/following{/other_user}","gists_url":"https://api.github.com/users/cockroachdb/gists{/gist_id}","starred_url":"https://api.github.com/users/cockroachdb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cockroachdb/subscriptions","organizations_url":"https://api.github.com/users/cockroachdb/orgs","repos_url":"https://api.github.com/users/cockroachdb/repos","events_url":"https://api.github.com/users/cockroachdb/events{/privacy}","received_events_url":"https://api.github.com/users/cockroachdb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cockroachdb/cockroach","description":"CockroachDB - the open source, cloud-native SQL database.","fork":false,"url":"https://api.github.com/repos/cockroachdb/cockroach","forks_url":"https://api.github.com/repos/cockroachdb/cockroach/forks","keys_url":"https://api.github.com/repos/cockroachdb/cockroach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cockroachdb/cockroach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cockroachdb/cockroach/teams","hooks_url":"https://api.github.com/repos/cockroachdb/cockroach/hooks","issue_events_url":"https://api.github.com/repos/cockroachdb/cockroach/issues/events{/number}","events_url":"https://api.github.com/repos/cockroachdb/cockroach/events","assignees_url":"https://api.github.com/repos/cockroachdb/cockroach/assignees{/user}","branches_url":"https://api.github.com/repos/cockroachdb/cockroach/branches{/branch}","tags_url":"https://api.github.com/repos/cockroachdb/cockroach/tags","blobs_url":"https://api.github.com/repos/cockroachdb/cockroach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cockroachdb/cockroach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cockroachdb/cockroach/git/refs{/sha}","trees_url":"https://api.github.com/repos/cockroachdb/cockroach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cockroachdb/cockroach/statuses/{sha}","languages_url":"https://api.github.com/repos/cockroachdb/cockroach/languages","stargazers_url":"https://api.github.com/repos/cockroachdb/cockroach/stargazers","contributors_url":"https://api.github.com/repos/cockroachdb/cockroach/contributors","subscribers_url":"https://api.github.com/repos/cockroachdb/cockroach/subscribers","subscription_url":"https://api.github.com/repos/cockroachdb/cockroach/subscription","commits_url":"https://api.github.com/repos/cockroachdb/cockroach/commits{/sha}","git_commits_url":"https://api.github.com/repos/cockroachdb/cockroach/git/commits{/sha}","comments_url":"https://api.github.com/repos/cockroachdb/cockroach/comments{/number}","issue_comment_url":"https://api.github.com/repos/cockroachdb/cockroach/issues/comments{/number}","contents_url":"https://api.github.com/repos/cockroachdb/cockroach/contents/{+path}","compare_url":"https://api.github.com/repos/cockroachdb/cockroach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cockroachdb/cockroach/merges","archive_url":"https://api.github.com/repos/cockroachdb/cockroach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cockroachdb/cockroach/downloads","issues_url":"https://api.github.com/repos/cockroachdb/cockroach/issues{/number}","pulls_url":"https://api.github.com/repos/cockroachdb/cockroach/pulls{/number}","milestones_url":"https://api.github.com/repos/cockroachdb/cockroach/milestones{/number}","notifications_url":"https://api.github.com/repos/cockroachdb/cockroach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cockroachdb/cockroach/labels{/name}","releases_url":"https://api.github.com/repos/cockroachdb/cockroach/releases{/id}","deployments_url":"https://api.github.com/repos/cockroachdb/cockroach/deployments","created_at":"2014-02-06T00:18:47Z","updated_at":"2018-04-17T18:30:04Z","pushed_at":"2018-04-17T19:09:20Z","git_url":"git://github.com/cockroachdb/cockroach.git","ssh_url":"git@github.com:cockroachdb/cockroach.git","clone_url":"https://github.com/cockroachdb/cockroach.git","svn_url":"https://github.com/cockroachdb/cockroach","homepage":"https://www.cockroachlabs.com","size":980030,"stargazers_count":13179,"watchers_count":13179,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1354,"mirror_url":null,"archived":false,"open_issues_count":1739,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":1354,"open_issues":1739,"watchers":13179,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755"},"html":{"href":"https://github.com/cockroachdb/cockroach/pull/24755"},"issue":{"href":"https://api.github.com/repos/cockroachdb/cockroach/issues/24755"},"comments":{"href":"https://api.github.com/repos/cockroachdb/cockroach/issues/24755/comments"},"review_comments":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755/comments"},"review_comment":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cockroachdb/cockroach/pulls/24755/commits"},"statuses":{"href":"https://api.github.com/repos/cockroachdb/cockroach/statuses/e95b2609db7e888f5e71587b755a9e014a3ddf12"}},"author_association":"OWNER"}}
{"actor":{"display_login":"mjibson"}}