技術メモのかけら

内容はもとより調べたことすら忘れてしまうので個人的なメモです。とにかく短く、結論だけ書いていきます。

PostgreSQLの識別子63バイト制限は別名にも適用される

試した環境: PostgreSQL 11

PostgreSQLのテーブル名や列名など識別子には最大63バイトの制限があり、それ以上の長さは切り捨てられる。
例えば、123456789A123456789B123456789C123456789D123456789E123456789F123456789Gと70バイトの名前をつけようとすると、勝手に63バイトで切り捨てられて123456789A123456789B123456789C123456789D123456789E123456789F123 という名前になる。

postgres=# create table
postgres=# "123456789A123456789B123456789C123456789D123456789E123456789F123456789G"
postgres=# (col1 text);

NOTICE:  identifier "123456789A123456789B123456789C123456789D123456789E123456789F123456789G" will be truncated to "123456789A123456789B123456789C123456789D123456789E123456789F123"
CREATE TABLE

エラーではなく切り捨てられるのは意外だったが、列名やテーブル名にASでつけた別名にも同じ制限が掛かるのはもっと意外だった。

postgres=# select 1 as "123456789A123456789B123456789C123456789D123456789E123456789F123456789G";

NOTICE:  identifier "123456789A123456789B123456789C123456789D123456789E123456789F123456789G" will be truncated to "123456789A123456789B123456789C123456789D123456789E123456789F123"
 123456789A123456789B123456789C123456789D123456789E123456789F123
-----------------------------------------------------------------
                                                               1
(1 row)

ただし、同じSQL内で別名を参照している場合、切り捨てたとNOTICEは出ているものの、長い名前の参照が問題なく行えます。

postgres=# select * from (
postgres=#   select 1 as "123456789A123456789B123456789C123456789D123456789E123456789F123456789G") as a
postgres=# where "123456789A123456789B123456789C123456789D123456789E123456789F123456789G" = 1;

NOTICE:  identifier "123456789A123456789B123456789C123456789D123456789E123456789F123456789G" will be truncated to "123456789A123456789B123456789C123456789D123456789E123456789F123"
NOTICE:  identifier "123456789A123456789B123456789C123456789D123456789E123456789F123456789G" will be truncated to "123456789A123456789B123456789C123456789D123456789E123456789F123"
 123456789A123456789B123456789C123456789D123456789E123456789F123
-----------------------------------------------------------------
                                                               1
(1 row)

SELECTした結果、別名をMAPのキーにして返すような実装をしていると見事にハマるので注意が必要。
そんな長い名前の別名をつけることないですが。

yum の検索オプション

yum searchrpm名などキーワードから該当するパッケージを探すことができる。

# yum search yumdownloader
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: mirror.vinahost.vn
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
========================================================= Matched: yumdownloader =========================================================
yum-utils.noarch : Utilities based around the yum package manager

yum providesでファイルがどのパッケージに含まれるか調べることができる。
どうやってインストールしたか分からなくなったコマンド調べる時に便利。

# yum provides "*/yumdownloader"
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: mirror.vinahost.vn
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
yum-utils-1.1.30-41.el6.noarch : Utilities based around the yum package manager
Repo        : base
Matched from:
Filename    : /usr/bin/yumdownloader



yum-utils-1.1.30-42.el6_10.noarch : Utilities based around the yum package manager
Repo        : updates
Matched from:
Filename    : /usr/bin/yumdownloader



yum-utils-1.1.30-42.el6_10.noarch : Utilities based around the yum package manager
Repo        : installed
Matched from:
Filename    : /usr/bin/yumdownloader

ファイルの指定は */yumdownloader*bin/yumdownloaderの形式にしないとダメみたい。

rpmがインストールするファイルを調べる

rpm -qlp

$ rpm -qlp pg_bigm-1.2.20161011-1.pg96.el6.x86_64.rpm
/usr/pgsql-9.6/lib/pg_bigm.so
/usr/pgsql-9.6/share/extension/pg_bigm--1.0--1.1.sql
/usr/pgsql-9.6/share/extension/pg_bigm--1.1--1.2.sql
/usr/pgsql-9.6/share/extension/pg_bigm--1.2.sql
/usr/pgsql-9.6/share/extension/pg_bigm.control

インストールした後は rpm -qs で調べる。

$ rpm -qs pg_bigm
通常          /usr/pgsql-9.4/lib/pg_bigm.so
通常          /usr/pgsql-9.4/share/extension/pg_bigm--1.0--1.1.sql
通常          /usr/pgsql-9.4/share/extension/pg_bigm--1.1--1.2.sql
通常          /usr/pgsql-9.4/share/extension/pg_bigm--1.2.sql
通常          /usr/pgsql-9.4/share/extension/pg_bigm.control

rpmの情報を調べる

rpm -qip

$ rpm -qip pg_bigm-1.2.20161011-1.pg96.el6.x86_64.rpm
Name        : pg_bigm                      Relocations: (not relocatable)
Version     : 1.2.20161011                      Vendor: NTT DATA CORPORATION
Release     : 1.pg96.el6                    Build Date: 2016年10月20日 11時58分33秒
Install Date: (not installed)               Build Host: localhost
Group       : Applications/Databases        Source RPM: pg_bigm-1.2.20161011-1.pg96.el6.src.rpm
Size        : 89410                            License: The PostgreSQL License
Signature   : (none)
URL         : http://pgbigm.sourceforge.jp/index.html
Summary     : 2-gram full text search for PostgreSQL
Description :
The pg_bigm module provides full text search capability in PostgreSQL.
This module allows a user to create 2-gram (bigram) index for faster full text search.

Note that this package is available for only PostgreSQL 9.6.

rpmファイルの依存関係を調べる

rpmファイルを指定して依存関係を調べる方法。

rpm -qpR ファイル名

$ rpm -qpR pg_bigm-1.2.20161011-1.pg96.el6.x86_64.rpm
libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
postgresql96-libs
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

Bashで変数展開やコマンド置換しないでヒアドキュメントしたい

クリップボードの内容をSSHで接続した先のファイルに保存したい場合にヒアドキュメントを良く使うのですが、
↓こういう書き方をすると、""で囲った時と同じように変数展開されたりコマンド置換されてしまい、シェルスクリプトのコピーなどでは都合が悪いです。

<実行コマンド>
cat<<EOS
$HOME
EOS

<出力結果>
/home/taro

そういうときは ヒアドキュメントの区切り文字(何て呼ぶんだろう)を'EOS'のようにシングルクウォートで囲めば展開されなくなります。

<実行コマンド>
cat<<'EOS'
$HOME
EOS

<出力結果>
$HOME