dblink: fix for non-admin users (#5902)

This commit is contained in:
Eric Fritz 2019-10-09 13:24:38 -05:00 committed by GitHub
parent e11504fef9
commit 70a2b8ba06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 138 additions and 21 deletions

View File

@ -36,7 +36,7 @@
- Nginx
For a detailed guide to installing prerequisites, see [these
instructions](doc/dev/local_development.md#step-2-install-dependencies).
instructions](doc/dev/local_development.md#step-1-install-dependencies).
### Installation
@ -44,8 +44,8 @@ instructions](doc/dev/local_development.md#step-2-install-dependencies).
To use Sourcegraph OSS:
1. [Ensure Docker is running](doc/dev/local_development.md#step-5-start-docker)
1. [Initialize the PostgreSQL database](doc/dev/local_development.md#step-4-initialize-your-database)
1. [Ensure Docker is running](doc/dev/local_development.md#step-3-macos-start-docker)
1. [Initialize the PostgreSQL database](doc/dev/local_development.md#step-2-initialize-your-database)
1. Start the development server
```

View File

@ -16,7 +16,7 @@ func TestMigrations(t *testing.T) {
// Setup a global test database
dbtesting.SetupGlobalTestDB(t)
m := dbconn.NewMigrate(dbconn.Global)
m := dbconn.NewMigrate(dbconn.Global, "")
// Run all down migrations then up migrations again to ensure there are no SQL errors.
if err := m.Down(); err != nil {
t.Errorf("error running down migrations: %s", err)

View File

@ -183,6 +183,23 @@ You need a fresh Postgres database and a database user that has full ownership o
instance with a name of the form `{PGDATABASE}_lsif`. It is assumed the
PostgreSQL instance is dedicated solely to Sourcegraph.
5. Configure PostgreSQL to use md5 authentication for the relevant users.
Update `pg_hba.conf` (typically located at `/etc/postgresql/${VERSION}/main/pg_hba.conf`). Check if it contains the following line:
```
local all all peer
```
If it does (or if the `sourcegraph` user is otherwise configured to use `peer` as its authentication method), change it to the following:
```
local all all md5
```
A value of `trust` is also acceptable, but `md5` is recommended. After updating the file,
restart PostgreSQL for the changes to take effect: `sudo systemctl restart postgresql`
### More info
For more information about data storage, [read our full PostgreSQL Guide
@ -305,6 +322,49 @@ If you ever need to wipe your local database and Redis, run the following comman
./dev/drop-entire-local-database-and-redis.sh
```
#### `dblink` error or `peer authentication failed`
If you see errors related to `dblink` and `peer authentication failed` that look the like the following:
```
18:08:28 lsif-worker | query failed:
18:08:28 lsif-worker | select * from
18:08:28 lsif-worker | dblink('dbname=' || $1 || ' user=' || current_user || ' password=' || $2, 'select * from schema_migrations')
18:08:28 lsif-worker | as temp(version text, dirty bool);
18:08:28 lsif-worker | -- PARAMETERS: ["sourcegraph","sourcegraph"]
18:08:28 lsif-worker | error: { error: could not establish connection
18:08:28 lsif-worker | at Connection.parseE (/home/$USER/src/github.com/sourcegraph/sourcegraph/lsif/node_modules/pg/lib/connection.js:604:11)
18:08:28 lsif-worker | at Connection.parseMessage (/home/$USER/src/github.com/sourcegraph/sourcegraph/lsif/node_modules/pg/lib/connection.js:401:19)
18:08:28 lsif-worker | at Socket.<anonymous> (/home/$USER/src/github.com/sourcegraph/sourcegraph/lsif/node_modules/pg/lib/connection.js:121:22)
18:08:28 lsif-worker | at Socket.emit (events.js:198:13)
18:08:28 lsif-worker | at addChunk (_stream_readable.js:288:12)
18:08:28 lsif-worker | at readableAddChunk (_stream_readable.js:269:11)
18:08:28 lsif-worker | at Socket.Readable.push (_stream_readable.js:224:10)
18:08:28 lsif-worker | at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
18:08:28 lsif-worker | name: 'error',
18:08:28 lsif-worker | length: 149,
18:08:28 lsif-worker | severity: 'ERROR',
18:08:28 lsif-worker | code: '08001',
18:08:28 lsif-worker | detail: 'FATAL: Peer authentication failed for user "sourcegraph"',
18:08:28 lsif-worker | hint: undefined,
18:08:28 lsif-worker | position: undefined,
18:08:28 lsif-worker | internalPosition: undefined,
18:08:28 lsif-worker | internalQuery: undefined,
18:08:28 lsif-worker | where: undefined,
18:08:28 lsif-worker | schema: undefined,
18:08:28 lsif-worker | table: undefined,
18:08:28 lsif-worker | column: undefined,
18:08:28 lsif-worker | dataType: undefined,
18:08:28 lsif-worker | constraint: undefined,
18:08:28 lsif-worker | file: 'dblink.c',
18:08:28 lsif-worker | line: '212',
18:08:28 lsif-worker | routine: 'dblink_get_conn' }
```
Ensure you've configured PostgreSQL to use `md5` or `trust` as the authentication mechanism for the
`sourcegraph` PostgreSQL user. You can do this by modifying `pg_hba.conf` and restarting PostgreSQL
(instructions are in the "Configure PostgreSQL to use md5 authentication" step above).
## How to Run Tests
See [testing.md](testing.md) for details.

View File

@ -26,8 +26,8 @@ import (
otlog "github.com/opentracing/opentracing-go/log"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
"github.com/sourcegraph/sourcegraph/internal/db/dbutil"
"github.com/sourcegraph/sourcegraph/internal/env"
"github.com/sourcegraph/sourcegraph/migrations"
"gopkg.in/inconshreveable/log15.v2"
)
@ -65,7 +65,7 @@ func ConnectToDB(dataSource string) error {
registerPrometheusCollector(Global, "_app")
configureConnectionPool(Global)
if err := DoMigrate(NewMigrate(Global)); err != nil {
if err := DoMigrate(NewMigrate(Global, dataSource)); err != nil {
return errors.Wrap(err, "Failed to migrate the DB. Please contact support@sourcegraph.com for further assistance")
}
@ -209,13 +209,17 @@ func configureConnectionPool(db *sql.DB) {
db.SetConnMaxLifetime(time.Minute)
}
func NewMigrate(db *sql.DB) *migrate.Migrate {
func NewMigrate(db *sql.DB, dataSource string) *migrate.Migrate {
driver, err := postgres.WithInstance(db, &postgres.Config{})
if err != nil {
log.Fatal(err)
}
s := bindata.Resource(migrations.AssetNames(), migrations.Asset)
s, err := dbutil.NewMigrationSourceLoader(dataSource)
if err != nil {
log.Fatal(err)
}
d, err := bindata.WithInstance(s)
if err != nil {
log.Fatal(err)

View File

@ -68,7 +68,7 @@ func NewDB(t testing.TB, dsn string) (*sql.DB, func()) {
config.Path = "/" + dbname
testDB := dbConn(t, config)
if err = dbutil.MigrateDB(testDB); err != nil {
if err = dbutil.MigrateDB(testDB, dsn); err != nil {
t.Fatalf("failed to apply migrations: %s", err)
}

View File

@ -1,6 +1,7 @@
package dbutil
import (
"bytes"
"context"
"database/sql"
"database/sql/driver"
@ -110,16 +111,64 @@ func NewDB(dsn, app string) (*sql.DB, error) {
return db, nil
}
func NewMigrationSourceLoader(dataSource string) (*bindata.AssetSource, error) {
// The following constructs a map of text placeholder/replacements
// that are run over the content of the migration files before being
// run. This is necessary as the lsif-server migrations need to reference
// the PGPASSWORD envvar to make a successful dblink connection in an
// environment where there is no superuser account (such as Amazon RDS).
pgPassword, err := pgPassword(dataSource)
if err != nil {
return nil, err
}
replacements := map[string]string{
"$$$PGPASSWORD$$$": pgPassword,
}
return bindata.Resource(migrations.AssetNames(), func(name string) ([]byte, error) {
asset, err := migrations.Asset(name)
if err != nil {
return nil, err
}
for placeholder, replacement := range replacements {
asset = bytes.Replace(asset, []byte(placeholder), []byte(replacement), -1)
}
return asset, nil
}), nil
}
func pgPassword(dataSource string) (string, error) {
if dataSource == "" {
return os.Getenv("PGPASSWORD"), nil
}
url, err := url.Parse(dataSource)
if err != nil {
return "", errors.Wrap(err, "dataSource is not a valid URL")
}
password, _ := url.User.Password()
return password, nil
}
// MigrateDB runs all migrations from github.com/sourcegraph/sourcegraph/migrations
// against the given sql.DB
func MigrateDB(db *sql.DB) error {
func MigrateDB(db *sql.DB, dataSource string) error {
var cfg postgres.Config
driver, err := postgres.WithInstance(db, &cfg)
if err != nil {
return err
}
s := bindata.Resource(migrations.AssetNames(), migrations.Asset)
s, err := NewMigrationSourceLoader(dataSource)
if err != nil {
return err
}
d, err := bindata.WithInstance(s)
if err != nil {
return err

View File

@ -81,7 +81,7 @@ export async function createPostgresConnection(configuration: Configuration): Pr
})
// Poll the schema migrations table until we are up to date
await waitForMigrations(connection, connectionOptions.database || '')
await waitForMigrations(connection, connectionOptions.database || '', connectionOptions.password || '')
return connection
}
@ -128,12 +128,13 @@ async function connect(connectionOptions: PostgresConnectionCredentialsOptions):
*
* @param connection The connection to use.
* @param database The target database in which to perform the query.
* @param password The currently authed user's password.
*/
async function waitForMigrations(connection: Connection, database: string): Promise<void> {
async function waitForMigrations(connection: Connection, database: string, password: string): Promise<void> {
while (true) {
try {
// Get migration version from frontend database
const currentVersion = await getMigrationVersion(connection, database)
const currentVersion = await getMigrationVersion(connection, database, password)
// Check to see if the current version is at least the minimum version
if (parseInt(currentVersion, 10) >= MINIMUM_MIGRATION_VERSION) {
@ -161,15 +162,16 @@ async function waitForMigrations(connection: Connection, database: string): Prom
*
* @param connection The database connection.
* @param database The target database in which to perform the query.
* @param password The currently authed user's password.
*/
async function getMigrationVersion(connection: Connection, database: string): Promise<string> {
async function getMigrationVersion(connection: Connection, database: string, password: string): Promise<string> {
const query = `
select * from
dblink('dbname=' || $1 || ' user=' || current_user, 'select * from schema_migrations')
dblink('dbname=' || $1 || ' user=' || current_user || ' password=' || $2, 'select * from schema_migrations')
as temp(version text, dirty bool);
`
const rows = (await connection.query(query, [database])) as {
const rows = (await connection.query(query, [database, password])) as {
version: string
dirty: boolean
}[]

View File

@ -1,6 +1,8 @@
-- Enable extension that allow us to perform SQL queries within another
-- connection context. This is necessary so that we can run migrations
-- on the <sg>_lsif database.
-- Note: `$$$PGPASSWORD$$$` is replaced by the frontend with the real
-- password for the currently authed user before migrations run.
CREATE EXTENSION IF NOT EXISTS dblink;
@ -10,7 +12,7 @@ CREATE EXTENSION IF NOT EXISTS dblink;
CREATE OR REPLACE FUNCTION remote_exec(suffix text, query text) RETURNS void AS $$
BEGIN
PERFORM dblink_exec('dbname=' || current_database() || suffix || ' user=' || current_user, query);
PERFORM dblink_exec('dbname=' || current_database() || suffix || ' user=' || current_user || ' password=$$$PGPASSWORD$$$', query);
END;
$$
LANGUAGE plpgsql;

6
migrations/bindata.go generated
View File

@ -252,7 +252,7 @@
// 1528395594_create_changeset_events_table.down.sql (56B)
// 1528395594_create_changeset_events_table.up.sql (588B)
// 1528395595_create_lsif_database.down.sql (236B)
// 1528395595_create_lsif_database.up.sql (1.697kB)
// 1528395595_create_lsif_database.up.sql (1.871kB)
// 1528395596_lsif_xrepo_init.down.sql (418B)
// 1528395596_lsif_xrepo_init.up.sql (1.06kB)
// 1528395597_lsif_commits.down.sql (334B)
@ -5365,7 +5365,7 @@ func _1528395595_create_lsif_databaseDownSql() (*asset, error) {
return a, nil
}
var __1528395595_create_lsif_databaseUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\x5d\x8f\xda\x38\x14\x7d\xcf\xaf\x38\xaa\x46\xca\x8c\xc4\xc7\x6a\xb5\x0f\xd5\xb2\x5d\x89\x82\x99\x22\x31\x61\x36\x09\x9a\xbe\x21\x93\x5c\x12\x6b\x82\x9d\xda\x4e\x01\x75\xfa\xdf\x57\x76\x42\x86\x59\x6d\xdb\x27\x22\x93\x9c\x7b\xcf\x87\xcf\x70\x08\x26\xf9\xae\x22\xd0\xc9\x92\x34\x42\x49\xd8\x92\x5b\xf0\xaa\x52\x47\x34\x06\x56\xa1\x26\xbd\x57\xfa\x80\xe4\x9f\x15\xbe\x34\xa4\x05\x19\x1c\x85\x2d\x85\x04\x97\xca\x96\xa4\x83\xe1\x10\x99\x92\x92\x32\xeb\x10\x32\x25\x2d\x9d\xec\x08\x69\x29\x0c\x84\x81\xa4\x8c\x8c\xe1\xfa\x0c\xa3\x5a\xfc\x23\x21\xe3\x12\xba\x91\x38\x88\x42\x73\xf7\x9d\x71\x30\x7e\x01\xc2\x5f\xa6\xf8\x7b\x5b\x19\xb1\x47\xce\x2d\xdf\x71\x43\xa3\x20\x98\xc5\x6c\x9a\x32\xb0\xcf\x29\x8b\x92\xe5\x3a\xc2\x72\x81\x68\x9d\x82\x7d\x5e\x26\x69\x82\x7c\x57\x09\xf9\x3c\x09\x1c\x8c\x9f\xbc\x6f\x64\xbb\x90\x6e\xa4\xf1\xb0\x85\xf8\x4a\xb2\x27\x72\x06\x6f\x8f\xb3\x46\x6b\x92\x16\x8d\x21\x0d\xe1\x37\x70\x20\x97\xd1\x90\xfc\x40\x39\xbe\x75\xaf\x6d\xf3\xdd\xf7\x6f\xa6\xd9\xef\xc5\xe9\xfb\x08\xcb\x3d\xda\x67\x47\x94\x0e\xb5\x3d\x0f\xdc\xf7\x12\xc2\x3a\x0c\x61\x3c\xc9\x16\xb4\x1f\xd4\x23\xaf\x37\x69\xb2\x9c\x33\xa8\x3d\xb8\x3c\x83\x4e\xc2\x58\x21\x0b\x58\xcd\xa5\xe1\x7e\xfb\x57\xe2\xeb\x18\x31\x7b\x5c\x4d\x67\x0c\x8b\x4d\x34\x4b\x9d\x04\x9a\x0e\xca\xd2\x96\x4e\x94\xdd\x76\x7b\x38\xed\x07\x1d\x41\xf7\x7c\x87\x98\xa5\x9b\x38\x4a\xf0\x55\x89\x1c\xd3\x04\x37\x37\xc1\x47\x76\xbf\x8c\x02\x00\x78\x64\xf1\x62\x1d\x3f\x74\xf2\xb5\x48\x61\xbe\x73\x9c\x3f\x84\x78\x79\x41\x4f\xbb\x5b\xfa\xf6\xce\x9d\x76\xc3\x5e\x5e\x10\x7a\xdd\xde\xbe\xeb\x4e\xba\x1d\xee\x26\x01\x8b\xe6\x93\xe0\xe6\x26\x58\x4d\xa3\xfb\xcd\xf4\x9e\xa1\xae\xea\xc2\x7c\xa9\x5a\xaf\x66\x9a\xb8\x25\xaf\xcf\x2a\x59\x2e\x5e\x1d\xc7\x93\x4f\x49\x68\xbd\x84\xd6\x59\x5a\x73\x6d\x45\xd6\x54\x5c\x77\x04\x2f\x41\x74\x40\x57\xa2\xe1\x58\x8a\xac\x1c\x60\xaf\x34\x8c\x3a\x10\x34\x71\xa3\xe4\x00\xb5\x32\xb6\xd0\x64\xc0\x65\x3e\x56\x1a\x85\xaa\xb8\x2c\x86\x6d\x08\xdd\x12\x42\x3e\xfb\x20\x1e\x29\xd4\x04\x21\x47\x48\x88\x50\x5a\x5b\x9b\x3f\xc7\xe3\x42\xd8\xb2\xd9\x8d\x32\x75\x18\xbf\xfd\x72\x7c\xf9\x15\xc6\x34\x64\xc6\xbf\xbf\xff\xc3\x0d\x77\x48\x3c\xcf\x85\xdb\x89\x57\xc8\xc9\x72\x51\x99\x11\x52\x05\xff\x62\xcb\xaa\xa5\xe2\x68\x40\x2a\x39\xbc\xe2\xc1\xab\xcb\x6d\x1a\xb4\x4b\x39\xad\x3b\xab\x7e\x1e\x8c\xcc\xab\xea\xef\xd0\x36\xdf\xdd\xfe\x22\x04\xbe\x08\x4c\xa3\x1d\x36\x72\x45\xc6\xa9\xce\x2b\x4d\x3c\xef\x52\x89\x1d\xed\x95\x26\x58\x7d\xf6\x01\x55\xdd\x04\x08\x3b\xf2\x10\x6f\x2f\xe3\x6d\xc2\x56\x6c\x96\x62\x11\xaf\x1f\x50\x17\xdb\x8c\x5b\x5e\xa9\x62\x54\x17\x7d\x8e\xf0\xf4\x89\xc5\xcc\xd9\xed\xb2\x86\x0f\x3f\x08\x5a\xe8\x39\x84\x77\x48\x3f\xb1\x76\xd9\xeb\xd4\x5e\xe7\x3f\x0c\x07\x08\x3b\x49\xe6\xd3\x74\xfa\x71\x9a\x30\xbc\xfb\x49\x86\x5b\xe8\x77\x58\x3f\x45\x2c\xc6\x9c\x2d\xa6\x9b\x55\x8a\x94\x3d\x3c\xae\x1c\x86\xa5\x43\x5d\x71\x4b\xbf\x81\x45\xb3\xf5\x7c\x19\xdd\x23\x0c\x37\xe9\xe2\x7d\x18\x86\x77\x13\xbf\x0a\x8b\xe6\x58\x2e\xfa\x84\xe3\x7f\x12\xde\x09\xf1\x5f\x3f\x26\xc1\x3c\x5e\x3f\xfe\xd8\xaf\xf6\x6e\xf4\xa6\x38\xc3\xaf\x4a\xda\x75\x8d\x2f\xee\xfc\xd2\x98\xbe\x88\x61\x44\x4e\xae\xd5\x8e\x54\x55\x7d\xff\x3a\xa0\xd7\x0a\xee\x3a\xcf\x5f\xb5\x5a\x2b\x77\x4c\x06\x59\x49\xd9\xb3\xff\xa3\xef\x63\x18\xeb\xfc\x6d\x1f\xb4\x6d\xea\x36\x82\xee\x62\xb9\xf9\x5d\xa5\x19\xd5\xe8\x8c\x0a\xcd\xeb\xf2\xba\xab\x3b\xd6\x6f\xec\x69\x8d\x7c\xf5\xe8\x17\x45\xee\x34\xfe\x37\x00\x00\xff\xff\x4b\x3d\xc8\x59\xa1\x06\x00\x00")
var __1528395595_create_lsif_databaseUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x55\x5d\x6f\xdb\x38\x10\x7c\xf7\xaf\x18\x14\x06\x94\x00\xfe\x38\x1c\xee\xa1\x68\xae\x07\xb8\x36\x9d\x1a\x70\x64\x9f\x24\x23\x7d\x4b\x69\x69\x2d\x11\xa1\x49\x95\xa4\xea\x18\x4d\xff\xfb\x81\x94\xec\x38\xc5\xb5\xf5\x8b\x05\x7d\xcc\xce\xce\xcc\x2e\x87\x43\x30\xc5\xb7\x92\x40\x4f\x8e\x94\x15\x5a\xc1\x55\xdc\x81\x4b\xa9\x0f\x68\x2c\x9c\x46\x4d\x66\xa7\xcd\x1e\xe9\xbf\x4b\x7c\x69\xc8\x08\xb2\x38\x08\x57\x09\x05\xae\xb4\xab\xc8\xf4\x86\x43\xe4\x5a\x29\xca\x9d\x47\xc8\xb5\x72\xf4\xe4\x46\xc8\x2a\x61\x21\x2c\x14\xe5\x64\x2d\x37\x47\x58\xdd\xe2\x1f\x08\x39\x57\x30\x8d\xc2\x5e\x94\x86\xfb\xef\xac\x87\x09\x04\x08\x7f\xdb\xf2\x9f\x07\x69\xc5\x0e\x05\x77\x7c\xcb\x2d\x8d\xfc\xd3\x58\x3b\x7a\x87\xcf\xfd\x7e\x7f\x7d\xbb\x9e\xa4\xe9\xfd\x2a\x99\xf5\xfb\xfd\xcf\xbe\x88\xa1\x5a\xf2\x9c\x0a\x6c\x8f\x01\x62\x67\x3c\x0d\x55\x04\xae\xe1\x8e\x21\x2e\x3d\x4a\xf7\xab\xb9\xb5\x07\x6d\x0a\xec\xb4\x09\xcf\xf3\xc6\x18\x52\x4e\x1e\xc1\x1b\x57\x51\x81\xc6\x92\xc1\x96\x76\xda\xd0\x05\x4d\xcf\x7a\xd4\xeb\x4d\x13\x36\xc9\x18\xd8\xa7\x8c\xc5\xe9\x62\x15\x63\x31\x47\xbc\xca\xc0\x3e\x2d\xd2\x2c\x45\xb1\x95\x42\x3d\xde\xf4\x7c\xc1\xa0\xc3\xae\x51\xad\x3c\xa6\x51\x36\xd4\x2b\xc5\x57\x52\x67\x59\x8f\xe0\xf6\x92\x46\x5b\x5d\x04\x3d\x3c\xc8\x49\x08\x28\xbe\xa7\x02\xdf\xba\xd7\x1e\x8a\xed\xf7\x6f\xb6\xd9\xed\xc4\xd3\xf7\x11\x16\x3b\xb4\xd7\x5e\x11\xda\xd7\xee\x38\xf0\xdf\x2b\x08\xe7\x31\x44\x20\xdf\x81\x9e\x0b\x9d\x91\x57\x9b\x2c\x5d\xcc\x18\xf4\x0e\x5c\x1d\x41\x4f\xc2\x3a\xa1\x4a\x38\xc3\x95\xe5\x81\xfd\x4b\xe3\xab\x04\x09\x5b\x2f\x27\x53\x86\xf9\x26\x9e\x66\x5e\x02\x43\x7b\xed\xe8\x81\x9e\x28\xbf\xea\x78\xf8\x24\x0c\xba\x06\xfd\xf5\x35\x12\x96\x6d\x92\x38\xc5\x57\x2d\x0a\x4c\x52\xf4\xfb\xbd\x0f\xec\x76\x11\xf7\xbc\x29\x6b\x96\xcc\x57\xc9\x5d\x27\x5f\x8b\x14\x15\x5b\xdf\xf3\xfb\x08\xcf\xcf\x38\xb7\xdd\x91\xbe\xba\xf6\x77\xbb\x62\xcf\xcf\x88\x82\x6e\xaf\xdf\x0d\x4a\x86\x67\x27\xcf\xdf\xff\x18\xa1\xa8\xe3\x78\x7d\xd3\x63\xf1\xec\xa6\xd7\xef\xf7\x96\x93\xf8\x76\x33\xb9\x65\xa8\x65\x5d\xda\x2f\xb2\xf5\x72\x6a\x88\x3b\x0a\xfa\x2d\xd3\xc5\xfc\x25\x9f\xb8\x0f\x99\x8e\x5c\x90\xd8\x79\xcb\x6b\x6e\x9c\xc8\x1b\xc9\x4d\x27\xc0\x69\x6c\x3c\xd0\x85\xa8\x38\x54\x22\xaf\x06\x21\x88\x56\xef\x43\x52\xad\x56\x03\xd4\xda\xba\xd2\x90\x05\x57\xc5\x58\x1b\x94\x5a\x72\x55\x0e\xdb\x2c\x7a\x12\x42\x3d\x86\xb1\x39\x50\x64\x08\x42\x8d\x90\x12\xa1\x72\xae\xb6\xef\xc6\xe3\x52\xb8\xaa\xd9\x8e\x72\xbd\x1f\xbf\xfe\x72\x7c\xfa\x17\xd6\x36\x64\xc7\x7f\xbe\xfd\xcb\x17\xf7\x48\xbc\x28\x84\xe7\xc4\x25\x0a\x72\x5c\x48\x3b\x42\xa6\x11\x5e\x6c\xbb\x6a\x5b\xf1\x6d\x40\x69\x35\xbc\xe8\x83\xcb\xd3\xec\x0f\x5a\x52\xde\x8b\xce\xca\x5f\x07\x27\x0f\xaa\x86\x89\x7f\x28\xb6\x57\xbf\x09\x49\x58\x5b\xb6\x31\x1e\x1b\x85\x26\xeb\x55\xe7\xd2\x10\x2f\xba\xd4\x9e\xa6\xd6\x99\x63\x08\xb0\xee\x2a\x40\xb8\x51\x80\x78\x3d\xac\x57\x29\x5b\xb2\x69\x86\x79\xb2\xba\x43\x5d\x3e\xe4\xdc\x71\xa9\xcb\x51\x5d\x9e\x73\x86\xfb\x8f\x2c\x61\xde\x6e\x9f\x45\xbc\xff\x49\x10\xa3\xd0\x43\x74\x8d\xec\x23\x6b\xc9\x5e\xa6\xfa\x72\x3e\xa2\x68\x80\xa8\x93\x64\x36\xc9\x26\x1f\x26\x29\xc3\x9b\x5f\x64\xbc\x85\x7e\x83\xd5\x7d\xcc\x12\xcc\xd8\x7c\xb2\x59\x66\xc8\xd8\xdd\x7a\xe9\x31\x1c\xed\x6b\xc9\x1d\xfd\x01\x16\x4f\x57\xb3\x45\x7c\x8b\x28\xda\x64\xf3\xb7\x51\x14\x5d\xdf\x04\x2a\x2c\x9e\x61\x31\x3f\x27\x1c\xff\x93\xf0\x4e\x88\x1f\xfd\xb8\xe9\xcd\x92\xd5\xfa\xe7\x7e\xb5\xb3\x71\x36\xc5\x1b\x7e\x71\xa4\xf8\x5d\x14\x8e\x99\xe2\xb4\xdf\xc3\xb1\x01\x2b\x0a\xf2\x5b\xef\x40\x52\x9e\x4f\x0b\x0f\xf4\x72\x60\x74\x3b\x31\x8c\x5a\x6d\xb4\xbf\x4d\x16\x79\x45\xf9\x63\x78\x70\x5e\xcb\xb0\xce\xfb\xdb\x5e\x18\xd7\xd4\x6d\x04\xfd\x60\xf9\xfa\xdd\xca\xb3\xba\x31\x39\x95\x86\xd7\xd5\xc5\xc9\x72\xea\xfa\x95\x3d\xad\x91\x2f\x1e\xfd\x66\xd1\x7b\x8d\xff\x0b\x00\x00\xff\xff\xd6\x05\x58\x22\x4f\x07\x00\x00")
func _1528395595_create_lsif_databaseUpSqlBytes() ([]byte, error) {
return bindataRead(
@ -5381,7 +5381,7 @@ func _1528395595_create_lsif_databaseUpSql() (*asset, error) {
}
info := bindataFileInfo{name: "1528395595_create_lsif_database.up.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa1, 0x5f, 0xfd, 0xb9, 0x74, 0xe2, 0x5f, 0x0, 0x6e, 0xc3, 0x5a, 0xa2, 0xf4, 0x54, 0x7b, 0x9f, 0x62, 0x27, 0xd, 0x78, 0x82, 0x80, 0x15, 0x22, 0x38, 0xe3, 0x9a, 0x3f, 0x2b, 0x43, 0x70, 0xe3}}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xc4, 0xbe, 0x42, 0x77, 0xa6, 0x82, 0xd1, 0x92, 0x6, 0x3a, 0x3d, 0x72, 0x13, 0x4c, 0xe0, 0xb5, 0x90, 0x4a, 0x25, 0x42, 0x6b, 0x67, 0x9d, 0x76, 0x44, 0x40, 0xbf, 0x1e, 0x1c, 0x54, 0x69}}
return a, nil
}